博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发:等待事件发生后所有线程继续执行
阅读量:5064 次
发布时间:2019-06-12

本文共 681 字,大约阅读时间需要 2 分钟。

 

等待某一个指定的事件发生后,才让多个等待的线程继续执行,以下是我能想到的几个方法,欢迎讨论、指正。

 

1.闭锁CountDownLatch

闭锁是典型的等待事件发生的同步工具类,将闭锁的初始值设置1,所有线程调用await方法等待,当事件发生时调用countDown将闭锁值减为0,则所有await等待闭锁的线程得以继续执行。

 

2.阻塞队列BlockingQueue

所有等待事件的线程尝试从空的阻塞队列获取元素,将阻塞,当事件发生时,向阻塞队列中同时放入N个元素(N的值与等待的线程数相同),则所有等待的线程从阻塞队列中取出元素后得以继续执行。

 

3.信号量Semaphore

设置信号量的初始值为等待的线程数N,一开始将信号量申请完,让剩余的信号量为0,待事件发生时,同时释放N个占用的信号量,则等待信号量的所有线程将获取信号量得以继续执行。 

 

4.栅栏CyclicBarrier

设置栅栏的初始值为1,当事件发生时,调用barrier.wait()冲破设置的栅栏,将调用指定的Runable线程执行,在该线程中启动N个新的子线程执行。这个方法并不是让执行中的线程全部等待在某个点,待某一事件发生后继续执行。

 

特别注意:不能用“条件队列”,多个线程阻塞等待在条件队列上,事件发生时调用“条件队列”的notifyAll方法或者signalAll方法虽然能唤醒所有等待线程,但是只有一个线程能够获得该条件队列的锁得以调度执行,其它线程未获得锁仍将继续阻塞等待。

 

转载于:https://www.cnblogs.com/williamjie/p/9456724.html

你可能感兴趣的文章
OA办公系统的发展离不开企业大胆尝试使用
查看>>
Cryptography -- 密码学
查看>>
测试的艺术:测试用例的设计
查看>>
对 Java 集合的巧妙利用
查看>>
listener:监听器(加载框架配置文件/执行任务调度/session的优化)
查看>>
MySql like 查询 变向写法(不用like 完成like查询)
查看>>
tensorflow--卷积神经网络
查看>>
python 字符串和容器总结
查看>>
HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
查看>>
【Android工具类】Activity管理工具类AppManager
查看>>
Asp.net视频摘要
查看>>
JNI 学习笔记
查看>>
函数指针声明时的形参列表可以没有
查看>>
gdb 的使用方法
查看>>
java 变量分类
查看>>
Chrome 静默打印及其它启动参数
查看>>
[转]Jquery中AJAX错误信息调试参考
查看>>
在vue-cli中搭建mock服务器
查看>>
Mysql ibd文件恢复指南
查看>>
很好的PHP分页类(调试过)
查看>>