您的位置:首页 > 编程语言 > Java开发

Java CyclicBarrier

2016-12-07 11:53 417 查看

Oracle官方文档

http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CyclicBarrier.html

package 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-countdownlatchcyclicbarrier

CountDownLatch和CyclicBarrier简单比较

.CountDownLatchCyclicBarrier
java.util.concurrentjava.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 cyclicbarr