Java多线程(3):使用Condition中的await、signal进行线程间协作

来源:互联网 发布:电子烟推荐 知乎2017 编辑:程序博客网 时间:2024/05/17 06:54

详情见《Java语言程序设计-进阶篇》P238

使用场景:

使用condition可以实现线程协作。取款线程发现账户余额不足,先停止自己的线程,等待存款线程存入钱后再叫醒该取款线程重新取钱。

编码流程:

从ReentrantLock对象获得Condition对象

Lock lock=new ReentrantLock();Condition condition=lock.newCondition();

一个取款线程A发现账户余额不足,

while(balance<amount){    System.out.println("await()");    condition.await();}    System.out.println("回来了threadA()");······finally{    lock.unlock();  }

线程A会在第四行停下来,进入休眠状态,不会去执行后面的finally内容!!
而这时一个存款线程B可以获取到这个锁然后进行存款操作,存款操作结束后,再调用signalAll():

condition.signalAll();System.out.println("先执行完所有threadB内容");······finally{    lock.unlock();}

调用signalAll()之后,线程B会将下面的全部代码执行完之后进入finally自己手动解锁,然后线程A才能拿到锁,并且在原来停下来的第四行继续往后执行,直至线程任务结束进入finally,解除lock。

一个需要注意的问题 :

普通一个线程(包括使用线程池!)中的任务执行完毕之后会自动结束!

Thread thread=new Thread(new Runnable()··············);thread.start();
0 0
原创粉丝点击