Java中的多线程技术可以有效地提高程序的运行效率,而条件对象Condition就是用来实现线程间协作的重要工具。Condition是java.util.concurrent.locks.Condition接口的实现,它是一个控制多线程之间交互的工具,可以替代Object的wait()、notify()、notifyAll()实现线程间的协调。
Condition的使用方法
Condition的使用方法有两步:
- 从ReentrantLock获取一个Condition实例,通过调用ReentrantLock的newCondition()方法获取;
- 调用Condition实例的await()方法使当前线程等待,调用signal()或signalAll()方法唤醒等待的线程。
Condition的示例代码
public class ConditionTest { public static void main(String[] args) { // 创建并发访问的账户 MyCount myCount = new MyCount("95599200901215522", 10000); // 创建一个锁对象 Lock lock = new ReentrantLock(); // 创建一个Condition Condition condition = lock.newCondition(); // 创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(2); Thread t1 = new SaveThread("张三", myCount, 2000, lock, condition); Thread t2 = new DrawThread("李四", myCount, 3600, lock, condition); // 执行各个线程 pool.execute(t1); pool.execute(t2); // 关闭线程池 pool.shutdown(); } } class MyCount { private String oid; private int cash; MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } } // 存款线程类 class SaveThread extends Thread { private String name; private MyCount myCount; private int x; private Lock lock; private Condition condition; SaveThread(String name, MyCount myCount, int x, Lock lock, Condition condition) { this.name = name; this.myCount = myCount; this.x = x; this.lock = lock; this.condition = condition; } public void run() { lock.lock(); // 获取锁 try { // 获取当前账户余额 int cash = myCount.getCash(); // 判断当前账户余额是否大于取款数目 if (cash >= x) { System.out.println(name + "取款成功,取出:" + x + ",余额为:" + (cash - x)); myCount.setCash(cash - x); condition.signalAll(); } else { System.out.println(name + "取款失败,余额不足!"); condition.await(); } } catch (InterruptedException e1) { e1.printStackTrace(); } finally { lock.unlock(); // 释放锁 } } } // 取款线程类 class DrawThread extends Thread { private String name; private MyCount myCount; private int x; private Lock lock; private Condition condition; DrawThread(String name, MyCount myCount, int x, Lock lock, Condition condition) { this.name = name; this.myCount = myCount; this.x = x; this.lock = lock; this.condition = condition; } public void run() { lock.lock(); // 获取锁 try { // 获取当前账户余额 int cash = myCount.getCash(); // 判断当前账户余额是否大于取款数目 if (cash >= x) { System.out.println(name + "取款成功,取出:" + x + ",余额为:" + (cash - x)); myCount.setCash(cash - x); condition.signalAll(); } else { System.out.println(name + "取款失败,余额不足!"); condition.await(); } } catch (InterruptedException e1) { e1.printStackTrace(); } finally { lock.unlock(); // 释放锁 } } }
上面的示例中,创建了两个线程t1和t2,t1线程用来存款,t2线程用来取款。当账户余额不足时,t2线程会被阻塞,直到t1线程存入指定金额之后,t2线程才会被唤醒。这里使用Condition的await()和signal()方法实现了线程间的协作。
通过使用Condition,可以更加精确地控制多个线程之间的协调,确保线程之间的正确交互。