Java CyclicBarrier
2016-12-07 11:53
417 查看
Oracle官方文档
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CyclicBarrier.htmlpackage java.util.concurrent.CyclicBarrier;
A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other. The barrier is called cyclic because it can be re-used after the waiting threads are released.
A CyclicBarrier supports an optional Runnable command that is run once per barrier point, after the last thread in the party arrives, but before any threads are released. This barrier action is useful for updating shared-state before any of the parties continue.
一个同步的辅助工具类,它允许一系列的线程全部等待,直到彼此都达到一个障碍点。CyclicBarriers在程序中是非常有用的,它使得一个固定大小的线程组必须偶尔的相互等待。该障碍被称为循环,因为它可以在等待线程被释放后重新使用。
CyclicBarrier允许一个可选的Runnable命令在每一个障碍点执行一次,执行时间在该组的最后一个线程到达之后,但是在所有线程被释放之前。该障碍动作对于在该组的所有成员继续运行之前更新共享状态是非常有用的。
测试用例
package com.demo.test; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierDemo { public static void main(String[] args) { final int PARTIES = 5; final CyclicBarrier cyclicBarrier = new CyclicBarrier(PARTIES); ExecutorService executorService = Executors.newFixedThreadPool(PARTIES); for (int i = 0; i < PARTIES; i++) { final int NO = i+1; executorService.submit(new Runnable() { public void run() { System.out.println("NO." + NO + " ready"); try { cyclicBarrier.await(); Thread.sleep((long) (Math.random() * 1000)); System.out.println("NO." + NO + " arrived"); cyclicBarrier.await(); System.out.println("NO." + NO + " receive the award"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }); } } }
执行结果
NO.1 ready NO.2 ready NO.3 ready NO.4 ready NO.5 ready NO.3 arrived NO.5 arrived NO.1 arrived NO.2 arrived NO.4 arrived NO.3 receive the award NO.5 receive the award NO.1 receive the award NO.2 receive the award NO.4 receive the award
参考
https://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrierCountDownLatch和CyclicBarrier简单比较
. | CountDownLatch | CyclicBarrier |
---|---|---|
包 | java.util.concurrent | java.util.concurrent |
适用情景 | 主线程等待多个工作线程结束 | 多个线程之间互相等待,直到所有线程达到一个障碍点(Barrier point) |
主要方法 | CountDownLatch(int count){初始化计数}、CountDownLatch.await{阻塞,直到等待计数为0解除阻塞}、CountDownLatch.countDown{计数减一} | CyclicBarrier(int parties, Runnable barrierAction){初始化参与者数量和障碍点执行Action,Action可选}、CyclicBarrier.await(){阻塞,直到所有线程达到屏障点} |
等待结束 | 各线程之间不再互相影响,可以继续做自己的事情。不再执行下一个目标工作。 | 在屏障点达到后,允许所有线程继续执行,达到下一个目标。可以重复使用CyclicBarrier |
异常 | 如果其中一个线程由于中断,错误,或超时导致永久离开屏障点,其他线程也将抛出异常。 | |
其他 | 如果BarrierAction不依赖于任何Party中的所有线程,那么在任何party中的一个线程被释放的时候,可以直接运行这个Action。If(barrier.await()==2) { //do action } |
相关文章推荐
- Java线程(十):CyclicBarrier-用路障实现分阶段线程并发
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- java thread CountDownLatch and CyclicBarrier
- java多线程问题之同步器CyclicBarrier
- java 多线程同步辅助类(CountDownLatch、CyclicBarrier、Semaphore)
- java并发编程中CountDownLatch和CyclicBarrier的使用 - [java]
- java多线程问题之同步器CyclicBarrier
- Java5 多线程(五)--CyclicBarrier同步的工具类
- Java5 多线程(五)--CyclicBarrier同步的工具类
- (11)java5的Semaphere、CyclicBarrier同步工具
- java-concurrent之CyclicBarrier
- Java CyclicBarrier 设置线程等待点
- Java多线程之CyclicBarrier
- java循环障碍CyclicBarrier
- Java线程之CyclicBarrier
- Java多线程之CyclicBarrier
- java.util.concurrent 中的CyclicBarrier用于多线程测试
- java之JUC系列-外部Tools-Executors|Semaphor|Exchanger|CyclicBarrier|CountDownLatch
- Java之CyclicBarrier使用
- java concurrent—CyclicBarrier