1 背景知识
在jdk1.5中引入了新特性:条件对象(condition varialbe)。什么是条件对象呢? 他是干什么用的呢?就是在一个线程在获得了锁,却不能开始执行有用工作的线程。
2 例子
在一个银行业务中,当我们执行了转账函数后,而帐号中金钱不足了。我们的需求是让该帐号处于等待状态,等待再次被唤醒,从而再次去判断是否有金钱,判断是否进行执行后面的程序。
使用方法:
1 Lock lock = new ReentrantLock()
2 Condition condition = lock.newCondition();
方法介绍:
condition.await():把该线程放到条件的等级集中去。
condition.signalAll():解除该条件的等待所有线程的阻塞状态。
1 /**
2 * 转账
3 *
4 * @param from
5 * 钱从这里消失
6 * @param to
7 * 钱流到这里来了
8 * @param amount
9 * 钱的数量
10 * @return 是否成功
11 */
12 public void transfer(int from, int to, double amount) {
13
14 try {
15 lock.lock();
16 if (account[from] - amount < 0) {
17 System.out.println("from " + from + "帐号中余额不足,暂停执行");
18 //使用条件变量,线程中断
19 condition.await();
20 System.out.println("from " + from + "帐号中余额不足,唤醒执行");
21 }
22 account[from] -= amount;
23 account[to] += amount;
24
25 System.out.printf("from:%d,to:%d,transfer:%10.2f ", from, to, amount);
26
27 System.out.println("sum:" + this.getTotleBalance());
28
29 //使所有线程变为“可运行”状态
30 condition.signalAll();
31 } catch (InterruptedException e) {
32 // TODO Auto-generated catch block
33 e.printStackTrace();
34 } finally {
35 lock.unlock();
36 }
37
38 }