三、CyclicBarrier 栅栏
CyclicBarrier 意思为循环的屏障,他要做的事情是一组线程到底一个屏障后停止,直到所有的线程到达这个屏障后继续执行。
CyclicBarrier 提供了两个构造方法,其中一个方法传入一个Runnable 其意思是当所有线程到达这个屏障后会优先执行者Runnable。
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
public CyclicBarrier(int parties) {
this(parties, null);
}
1、默认构造方法
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
static CyclicBarrier barrier = new CyclicBarrier(4);
static class MyThread implements Runnable{
public void run() {
try {
System.out.println("start CyclicBarrier"+Thread.currentThread().getName());
barrier.await(); // 等待线程到齐
System.out.println("end CyclicBarrier"+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 启动4个线程 满足barrier 定义数量
for(int i=0;i<4;i++) {
new Thread(new MyThread()).start();
}
}
}
2、barrierAction 构造方法
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierActionTest {
static CyclicBarrier barrierAction = new CyclicBarrier(4, new MyBarrier());
static class MyThread implements Runnable {
public void run() {
try {
System.out.println("start CyclicBarrier " + Thread.currentThread().getName());
barrierAction.await(); // 等待线程到齐
System.out.println("end CyclicBarrier " + Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class MyBarrier implements Runnable {
public void run() {
// 线程计数到齐后执行此线程
System.out.println("start MyBarrier"+ Thread.currentThread().getName());
}
}
public static void main(String[] args) {
// 启动4个线程 满足barrier 定义数量
for (int i = 0; i < 4; i++) {
new Thread(new MyThread()).start();
}
}
}
找了张网图觉得画的很清楚
注:CountDownLatch 的计数器只能使用一次而CyclicBarrier 可以重复使用,这是两者最大的区别