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

详情见《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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 理解程序、进程、线程的概念程序可以理解为静态的代码进程可以理解为执行中的程序 线程可以理解为进程的进一步细分,程序...
    __豆约翰__阅读 741评论 0 4
  • 理解程序、进程、线程的概念程序可以理解为静态的代码进程可以理解为执行中的程序 线程可以理解为进程的进一步细分,程序...
    十一_2bef阅读 383评论 0 0
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    小徐andorid阅读 3,018评论 3 53
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,924评论 2 20
  • 此刻的南京已经美得让我陶醉
    颠覆整个世界_阅读 226评论 1 3

友情链接更多精彩内容