Java多线程编程之Condition的await和signal等待/通知机制 Condition简介 在Java中,任何一个对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,如wait()、wait(long timeout)、wait(long timeout, int nanos)与notify()、notifyAll()几个方法实现等待/通知机制。同样的,在Java Lock体系下依然会有同样的方法实现等待/通知机制。 Condition与Lock配合完成等待通知机制,前者是Java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。 Condition与Object的wait和notify/notifyAll方法的区别 Condition能够支持不响应中断,而通过使用Object方式不支持;Condition能够支持多个等待队列(new多个Condition对象),而Object方式只能支持一个;Condition能够支持超时时间的设置,而Object不支持。 Condition的await方法 void await() throws InterruptedException:当前线程进入等待状态,如果其他线程调用condition的signal或者signalAll方法并且当前线程获取Lock从await方法返回,如果在等待状态中被中断会抛出被中断异常。 long awaitNanos(long nanosTimeout):当前线程进入等待状态直到被通知,中断或者超时。 boolean await(long time, TimeUnit unit) throws InterruptedException:同第二种,支持自定义时间单位。 boolean awaitUntil(Date deadline) throws InterruptedException:当前线程进入等待状态直到被通知,中断或者到了某个时间。 Condition的signal方法 void signal():唤醒一个等待在condition上的线程,将该线程从等待队列中转移到同步队列中,如果在同步队列中能够竞争到锁则返回。 void signalAll():唤醒所有等待在condition上的线程,将这些线程从等待队列中转移到同步队列中,如果在同步队列中能够竞争到锁则返回。 Condition的使用场景 Condition的await方法可以用于实现线程间的等待/通知机制,例如在生产者消费者模式中,生产者线程可以使用Condition的await方法等待消费者线程消费完毕,然后继续生产,而消费者线程可以使用Condition的signal方法唤醒生产者线程继续生产。 Condition的await方法也可以用于实现线程池中的线程等待机制,例如在线程池中,某个线程可以使用Condition的await方法等待其他线程完成任务,然后继续执行其他任务。 Condition的优点 Condition提供了更加灵活的等待/通知机制,可以根据实际情况选择不同的等待/通知策略。Condition也提供了更加高效的等待/通知机制,例如可以使用超时时间的设置来避免线程长时间等待。 Condition的缺点 Condition的使用需要结合Lock来使用,否则可能会出现线程安全问题。Condition的await方法可能会抛出InterruptedException异常,需要catch该异常并进行处理。 Condition提供了一种更加灵活和高效的等待/通知机制,能够满足各种线程间通信的需求,但需要正确地使用Condition来避免线程安全问题。
![](https://csdnimg.cn/release/download_crawler_static/87924632/bg4.jpg)
剩余16页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/5fd8146ad2d34c059fc9d00d6db08c06_weixin_43516258.jpg!1)
- 粉丝: 158
- 资源: 216
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)