参考:
Java
并发编程的艺术https://blog.csdn.net/qq_39241239/article/details/87030142
https://www.cnblogs.com/skywang12345/p/3533995.html#a2
JDK
版本:AdoptOpenJDK 11.0.2+9
1 概念
CyclicBarrier
被定义为一个屏障,当一组线程到达时被阻塞,直到最后一个线程到达时才会打开屏障,所有被屏障拦截的线程才会继续运行。
CyclicBarrier
接收一个int
型的参数,表示屏障拦截的线程数量。
CyclicBarrier
是可复用的屏障,也可以调用reset()
方法立刻重置。
CyclicBarrier
还提供了一个 CyclicBarrier(int parties, Runnable barrierAction)
构造函数,其中barrierAction
可用于当所有线程到达屏障时,优先执行的操作,然后再唤醒所有线程。
2 方法
CyclicBarrier
提供了一些方法:
方法 | 说明 |
---|---|
await() |
使当前线程进入同步队列进行等待,所有的线程都到达屏障为止,可以响应中断。 |
await(long timeout, TimeUnit unit) |
带超时时间的await() 。 |
getNumberWaiting() |
返回当前正阻塞在屏障处的线程个数(实时改变)。 |
getParties() |
返回应该要绕过这个屏障的线程个数,也就是构造函数参数中指定的阻塞线程个数。 |
reset() |
重置。 |
3 例子
public class CyclicBarrierTest {
public static void main(String[] args) {
BarrierAction ba = new BarrierAction();
CyclicBarrier cb = new CyclicBarrier(3, ba);
Worker worker1 = new Worker("worker-thread-1", 1, cb);
Worker worker2 = new Worker("worker-thread-2", 2, cb);
Worker worker3 = new Worker("worker-thread-3", 3, cb);
ba.setWorkers(worker1, worker2, worker3);
worker1.start();
worker2.start();
worker3.start();
}
}
/**
* 工作线程
*/
class Worker extends Thread {
private String name;
private int n;
private CyclicBarrier cb;
public Worker(String name, int n, CyclicBarrier cb) {
this.name = name;
this.n = n;
this.cb = cb;
}
@Override
public void run() {