博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JAVA】java中CyclicBarrier的使用方法,实例解说
阅读量:5331 次
发布时间:2019-06-14

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

一个同步辅助类,它同意一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。此时 CyclicBarrier 非常实用。

由于该 barrier 在释放等待线程后能够重用,所以称它为循环 的 barrier。 

上一篇的程序是用CountDownLatch实现的,如今用CyclicBarrier改写试试

package thread.thread;import java.util.concurrent.CountDownLatch;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * ClassName:CountDownLatchTest 
* Function: TODO ADD FUNCTION.
* Reason: TODO ADD REASON.
* Date: 2015年7月30日 下午2:04:07
* * @author chiwei * @version * @since JDK 1.6 * @see */public class CyclicBarrierTest { public static void main(String[] args) { ThreadPoolExecutor poolExe = new ThreadPoolExecutor(100, 1000, 1, TimeUnit.SECONDS, new LinkedBlockingDeque
(100)); int count = 10; // 考试開始铃声响起。考试開始 final CountDownLatch examBegin = new CountDownLatch(1); // 单个考生,考试结束交卷 final CyclicBarrier student = new CyclicBarrier(count+1); // 一个考场10位考生 for (int i = 0; i < count; i++) { Runnable runnable = new Runnable() { public void run() { try { System.out.println("考生" + Thread.currentThread().getName() + "在等待考试開始的铃声响起"); examBegin.await(); System.out.println("考生听到铃声" + Thread.currentThread().getName() + "開始答题"); Thread.sleep((long) (Math.random() * 100));//答题过程,真正的业务逻辑处理部分 System.out.println("考生" + Thread.currentThread().getName() + "交卷"); student.await(); } catch (Exception e) { e.printStackTrace(); } } }; poolExe.execute(runnable); // 运动员開始任务 } try { // 答题时间 Thread.sleep((long) (Math.random() * 10000)); System.out.println("考场" + Thread.currentThread().getName() + "開始铃声即将响起"); examBegin.countDown(); System.out.println("考场" + Thread.currentThread().getName() + "考试開始铃声响起"); student.await(); // 全部考生交卷 System.out.println("考场" + Thread.currentThread().getName() + "考试结束"); } catch (Exception e) { e.printStackTrace(); } poolExe.shutdown(); }}
CountDownLatch的构造方法的參数count值是调用countDown的数量,而CyclicBarrier的数量是await,所以加1

考生pool-1-thread-1在等待考试開始的铃声响起考生pool-1-thread-2在等待考试開始的铃声响起考生pool-1-thread-6在等待考试開始的铃声响起考生pool-1-thread-7在等待考试開始的铃声响起考生pool-1-thread-5在等待考试開始的铃声响起考生pool-1-thread-4在等待考试開始的铃声响起考生pool-1-thread-10在等待考试開始的铃声响起考生pool-1-thread-9在等待考试開始的铃声响起考生pool-1-thread-3在等待考试開始的铃声响起考生pool-1-thread-8在等待考试開始的铃声响起考场main開始铃声即将响起考场main考试開始铃声响起考生听到铃声pool-1-thread-1開始答题考生听到铃声pool-1-thread-2開始答题考生听到铃声pool-1-thread-6開始答题考生听到铃声pool-1-thread-7開始答题考生听到铃声pool-1-thread-5開始答题考生听到铃声pool-1-thread-4開始答题考生听到铃声pool-1-thread-3開始答题考生听到铃声pool-1-thread-8開始答题考生听到铃声pool-1-thread-9開始答题考生听到铃声pool-1-thread-10開始答题考生pool-1-thread-5交卷考生pool-1-thread-4交卷考生pool-1-thread-9交卷考生pool-1-thread-2交卷考生pool-1-thread-6交卷考生pool-1-thread-1交卷考生pool-1-thread-10交卷考生pool-1-thread-7交卷考生pool-1-thread-8交卷考生pool-1-thread-3交卷考场main考试结束
从结果来看。和CountDownLatch达到相同的效果。

注意二者的差别:

CountDownLatch是在多个线程都运行的countDown后才触发事件,唤醒await在latch上的线程。而运行countDown的线程,在运行完countDown后继续自己线程的工作。

CyclicBarrier是一个栅栏。用于同步全部调用await方法的线程。而且等全部线程都到了await方法的时候,它们一起返回继续各自的工作,最外层的一个await是的计数到0,才是的全部线程得以继续运行。由于使用CyclicBarrier的线程会堵塞在await方法上,所以在线程池中使用要格外小心,假设线程池的线程数量过少。就会发生死锁

student.await();System.out.println("看看CyclicBarrier的await方法能不能把我堵塞住!");
考生pool-1-thread-1在等待考试開始的铃声响起考生pool-1-thread-3在等待考试開始的铃声响起考生pool-1-thread-2在等待考试開始的铃声响起考生pool-1-thread-4在等待考试開始的铃声响起考生pool-1-thread-5在等待考试開始的铃声响起考生pool-1-thread-6在等待考试開始的铃声响起考生pool-1-thread-7在等待考试開始的铃声响起考生pool-1-thread-8在等待考试開始的铃声响起考生pool-1-thread-9在等待考试開始的铃声响起考生pool-1-thread-10在等待考试開始的铃声响起考场main開始铃声即将响起考场main考试開始铃声响起考生听到铃声pool-1-thread-1開始答题考生听到铃声pool-1-thread-2開始答题考生听到铃声pool-1-thread-5開始答题考生听到铃声pool-1-thread-7開始答题考生听到铃声pool-1-thread-10開始答题考生听到铃声pool-1-thread-3開始答题考生听到铃声pool-1-thread-9開始答题考生听到铃声pool-1-thread-8開始答题考生听到铃声pool-1-thread-6開始答题考生听到铃声pool-1-thread-4開始答题考生pool-1-thread-2交卷考生pool-1-thread-10交卷考生pool-1-thread-1交卷考生pool-1-thread-3交卷考生pool-1-thread-5交卷考生pool-1-thread-4交卷考生pool-1-thread-8交卷考生pool-1-thread-7交卷考生pool-1-thread-6交卷考生pool-1-thread-9交卷看看CyclicBarrier的await方法能不能把我堵塞住!

考场main考试结束 看看CyclicBarrier的await方法能不能把我堵塞住!

看看CyclicBarrier的await方法能不能把我堵塞住!

看看CyclicBarrier的await方法能不能把我堵塞住! 看看CyclicBarrier的await方法能不能把我堵塞住! 看看CyclicBarrier的await方法能不能把我堵塞住!

看看CyclicBarrier的await方法能不能把我堵塞住。 看看CyclicBarrier的await方法能不能把我堵塞住! 看看CyclicBarrier的await方法能不能把我堵塞住!

看看CyclicBarrier的await方法能不能把我堵塞住!

从结果来看,CyclicBarrier的await方法的确堵塞当前线程的继续运行。仅仅有计数到0才会得以所有继续运行。

student.countDown();System.out.println("看看CountDownLatch的countDown方法能不能把我堵塞住!

");

考生pool-1-thread-1在等待考试開始的铃声响起考生pool-1-thread-3在等待考试開始的铃声响起考生pool-1-thread-2在等待考试開始的铃声响起考生pool-1-thread-4在等待考试開始的铃声响起考生pool-1-thread-5在等待考试開始的铃声响起考生pool-1-thread-6在等待考试開始的铃声响起考生pool-1-thread-9在等待考试開始的铃声响起考生pool-1-thread-8在等待考试開始的铃声响起考生pool-1-thread-7在等待考试開始的铃声响起考生pool-1-thread-10在等待考试開始的铃声响起考场main開始铃声即将响起考场main考试開始铃声响起考生听到铃声pool-1-thread-3開始答题考生听到铃声pool-1-thread-2開始答题考生听到铃声pool-1-thread-1開始答题考生pool-1-thread-2交卷考生听到铃声pool-1-thread-10開始答题考生听到铃声pool-1-thread-7開始答题考生听到铃声pool-1-thread-8開始答题考生听到铃声pool-1-thread-9開始答题考生听到铃声pool-1-thread-6開始答题考生听到铃声pool-1-thread-5開始答题考生听到铃声pool-1-thread-4開始答题考生pool-1-thread-9交卷看看CountDownLatch的countDown方法能不能把我堵塞住!看看CountDownLatch的countDown方法能不能把我堵塞住!考生pool-1-thread-10交卷看看CountDownLatch的countDown方法能不能把我堵塞住!考生pool-1-thread-7交卷看看CountDownLatch的countDown方法能不能把我堵塞住!考生pool-1-thread-4交卷看看CountDownLatch的countDown方法能不能把我堵塞住。考生pool-1-thread-3交卷看看CountDownLatch的countDown方法能不能把我堵塞住!

考生pool-1-thread-5交卷 看看CountDownLatch的countDown方法能不能把我堵塞住! 考生pool-1-thread-6交卷 看看CountDownLatch的countDown方法能不能把我堵塞住!

考生pool-1-thread-1交卷 看看CountDownLatch的countDown方法能不能把我堵塞住! 考生pool-1-thread-8交卷 看看CountDownLatch的countDown方法能不能把我堵塞住! 考场main考试结束

而CountDownLatch的countDown方法运行后。线程会继续运行,不会堵塞。

转载于:https://www.cnblogs.com/jzdwajue/p/7000858.html

你可能感兴趣的文章
在 Android 中实现 Redux 的一点经验
查看>>
leetcode-78-子集
查看>>
Kotlin 字符模板
查看>>
模仿mybatis,用jdk proxy实现接口
查看>>
LINUX进程小结
查看>>
公告会看门道:四个不同的厨师和史蒂夫·乔布斯
查看>>
HDU 1983 BFS&amp;&amp;DFS
查看>>
c++开源项目汇总
查看>>
python yield返回多个值
查看>>
每日站立会议及今日份任务
查看>>
iOS 6编程-UIScrollView滚动视图和UIPageControl分页控件实现图像分页显示(2)
查看>>
Deploying Customizations in Oracle E-Business Suite Release 12.2
查看>>
R12 付款过程请求-功能和技术信息 (文档 ID 1537521.1)
查看>>
鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包
查看>>
十个矩阵乘法的应用
查看>>
对话机器学习大神Yoshua Bengio(上)
查看>>
matlab中函数fscanf
查看>>
洛谷 4364 [九省联考2018]IIIDX
查看>>
洛谷 3870 [TJOI2009]开关
查看>>
【牛客-16643】统计数字(简单排序)
查看>>