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

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

使用场景:

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

编码流程:

从ReentrantLock对象获得Condition对象

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

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

while(balance

线程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();

你可能感兴趣的:(Java多线程(3):使用Condition中的await、signal进行线程间协作)