线程辅助类(四)--CyclicBarrier
来源:互联网 发布:奇点大学 知乎 编辑:程序博客网 时间:2024/06/14 07:58
CyclicBarrier是一类线程辅助类,用于在多个线程间,在某一个点相互等待,
待所有线程都到齐后,每个线程再接着往下执行,在同步点,可以操作执行(由最后一个到达同步点的线程执行)。
CyclicBarrier涉及到的关键点有如下几点:
1、new CyclicBarrier(n) ,即初始化时,指定在n个线程间进行同步;
2、new CyclicBarrier(n,barrierAction) ,另一种初始化方式,指定在n个线程间进行同步,
同时与1不同的是,有同步点处理barrierAction,需要注意的是,在各线程均到达同步点后,
barrierAction才会被调用(其实也就是最后一个到达同步点的线程执行),接下来各线程才会执行各自的逻辑;
3、cb.await() ,每个线程到同步点后调用,等待其它线程到同步点。
实例如下:
public class CyclicBarrierMain { public static void main(String[] args) throws Exception {// runWait(); //无同步点处理 runWaitWithBarrierAction(); //有同步点处理 } static class Operator implements Runnable{ private CyclicBarrier cb; public Operator(CyclicBarrier cb) { this.cb = cb; } @Override public void run() { System.out.println(Thread.currentThread().getName()+ " step one"); try { cb.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ " step two"); } } static void runWait(){ ExecutorService es = Executors.newCachedThreadPool(); CyclicBarrier cb = new CyclicBarrier(5); for(int i=0;i<5;i++){ es.execute(new Operator(cb)); } es.shutdown(); } static class BarrierAction implements Runnable{ @Override public void run() { try { System.out.println(); TimeUnit.MILLISECONDS.sleep(500); System.out.println(Thread.currentThread().getName()+ " finished"); System.out.println(); } catch (InterruptedException e) { e.printStackTrace(); } } } /* 执行完后的有同步点处理 */ static void runWaitWithBarrierAction(){ ExecutorService es = Executors.newCachedThreadPool(); CyclicBarrier cb = new CyclicBarrier(5,new BarrierAction()); for(int i=0;i<5;i++){ es.execute(new Operator(cb)); } es.shutdown(); }}
运行结果:
pool-1-thread-1 step one
pool-1-thread-2 step one
pool-1-thread-4 step one
pool-1-thread-5 step one
pool-1-thread-3 step one
pool-1-thread-3 finished
pool-1-thread-1 step two
pool-1-thread-4 step two
pool-1-thread-2 step two
pool-1-thread-5 step two
pool-1-thread-3 step two
阅读全文
0 0
- 线程辅助类(四)--CyclicBarrier
- 多线程辅助类之CyclicBarrier(四)
- 线程同步辅助-CyclicBarrier(搬迁至此)
- 同步辅助类CyclicBarrier
- 并发线程库中并发辅助类CyclicBarrier使用详解
- 并发编程实战手册-线程同步辅助类之CyclicBarrier
- CyclicBarrier -- 同步辅助类2
- java多线程 栅栏(CyclicBarrier) 和 多线程辅助类 CountDownLatch
- CyclicBarrier公共屏障点:一个同步辅助类,它允许一组线程互相等待
- JAVA多线程—CyclicBarrier-一个同步辅助类,它允许一组线程互相等待
- 同步辅助类 CountDownLatch、CyclicBarrier作用
- java多线程:12、CyclicBarrier同步辅助类
- 同步辅助类 java.util.concurrent.CyclicBarrier
- 线程同步工具类--CyclicBarrier
- 线程辅助类(一)--Exchanger
- 线程辅助类(二)--CountDownLatch
- 线程辅助类(三)--Semaphore
- 线程辅助类(五)--Phaser
- Http协议响应的解析
- 《并发编程》读书笔记1
- 翻译-关于为什么没有ArcSDE10.3
- python shell 清屏
- 洛谷OJ-P1219 八皇后-深度优先搜索
- 线程辅助类(四)--CyclicBarrier
- 基于android studio 的按键震动程序的实现
- BeanUtils工具使用
- 前端学习之JavaScript(二)
- 拼接html a标签字符串,onClick传递两个字符串类型参数写法
- 良好编程风格的一些小技巧
- GitHub上下载代码
- Django 数据库回滚
- 1007: 求平均分