java并发之同步屏障CyclicBarrier
2017-10-14 17:01
375 查看
CyclicBarrier 是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
实例:组织一个老板参加的会议,人到齐之前,先到的在会议室等一下。人都来齐了,老板先发言,然后会议正式开始讨论议题,谁积极谁先发言。
CyclicBarrier和CountDownLatch的区别
CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。
参考原文:
http://ifeve.com/concurrency-cyclicbarrier/
实例:组织一个老板参加的会议,人到齐之前,先到的在会议室等一下。人都来齐了,老板先发言,然后会议正式开始讨论议题,谁积极谁先发言。
public class Participant implements Runnable { private CyclicBarrier cyclicBarrier; private String name; private Long cost; public Participant(String name,CyclicBarrier cyclicBarrier,Long cost) { this.cyclicBarrier=cyclicBarrier; this.name = name; this.cost=cost; } @Override public void run() { try { Thread.sleep(cost); cyclicBarrier.await(); System.out.println(name); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Runnable boss=new Runnable(){ @Override public void run() { System.out.println("老板先讲两句。"); } }; CyclicBarrier c = new CyclicBarrier(3,boss); Thread t1=new Thread(new Participant("第1个与会者发言,我不一定第一个说",c,5000L)); t1.start(); Thread t2=new Thread(new Participant("第2个与会者发言",c,8000L)); t2.start(); System.out.println("人到齐了,准备开始。"); c.await 4000 (); System.out.println("第3个与会者发言"); } }
CyclicBarrier和CountDownLatch的区别
CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。
参考原文:
http://ifeve.com/concurrency-cyclicbarrier/
相关文章推荐
- Java并发工具类(二):同步屏障CyclicBarrier
- Java多线程-并发工具类(一)同步屏障CyclicBarrier
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
- java.util.concurrent.CyclicBarrier同步屏障工具类源码解析
- 并发工具类(二)同步屏障CyclicBarrier
- JAVA线程同步辅助类CyclicBarrier循环屏障
- Java并发编程-同步辅助类之CyclicBarrier
- Java并发之CyclicBarrier 可重用同步工具类
- Java高并发程序-Chapter3 JDK并发包(第十五讲)同步控制之CyclicBarrier 循环栅栏
- Java并发:同步工具类详解(CountDownLatch、CyclicBarrier、Semaphore)
- java多线程--同步屏障CyclicBarrier的使用
- Java并发同步之CountDownLatch、CyclicBarrier和Semaphore
- Java并发同步工具类之CyclicBarrier
- Java多线程与并发库高级应用之公共屏障点CyclicBarrier
- 并发工具类:同步屏障CyclicBarrier
- Java并发编程之2——同步工具类的使用(CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore)
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semphore、Phaser)
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser、Exchanger)
- java 并发编程实战第三章同步辅助类CyclicBarrier解析
- java.util.concurrent中:同步屏障CyclicBarrier