日期:2014-05-17  浏览次数:20696 次

Java 多线程 条件变量
Java多线程 条件变量

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 }

------解决方案--------------------
对我有用,谢了