CyclicBarrier 过来就是:循环的障,这个类是一个可以重复利用的 障类。它允许一组线程相互等待,直到全部到达某个公共障点,然后所有 的这组线程再同步往后执行。
用法介绍
与CountDownLatch不同,CountDownLatch的作用是使得某些(即在await之前并加入countDown操作的)进程在其他进程执行之后在进行;CyclicBarrier 则是使得一组线程相互等待,公共屏障点之后,然后这组线程同步向前进行。
package com.grace527.test;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CBTest {
static Long sleeptime = 2000L;
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3,new MainTest());
TestWorker t1 = new TestWorker("程序员1", barrier);
TestWorker t2 = new TestWorker("程序员2", barrier);
TestWorker t3 = new TestWorker("程序员3", barrier);
TestWorker t4 = new TestWorker("程序员4", barrier);
TestWorker t5 = new TestWorker("程序员5", barrier);
TestWorker t6 = new TestWorker("程序员6", barrier);
TestWorker t9 = new TestWorker("程序员9", barrier);
TestWorker t7 = new TestWorker("程序员7", barrier);
TestWorker t8 = new TestWorker("程序员8", barrier);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
System.out.println("主线程结束");
}
static class MainTest extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("同步子线程已执行,继续循环");
}
}
static class TestWorker extends Thread{
private String workername;
private CyclicBarrier barrier;
public TestWorker(String workername, CyclicBarrier barrier) {
super();
this.workername = workername;
this.barrier = barrier;
}
@Override
public void run() {
// TODO Auto-generated method stub
sleeptime = sleeptime+500;
try {
System.out.println("workername:"+workername +"开始工作");
sleep(sleeptime);
barrier.await();
System.out.println("workername:"+workername +"停止工作");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果分析:
我们可以发现,没标记的代码是在运行开始就给出的,后面标记的三部分 是在三个时间点(即每三个线程完成一次循环—都运行了await()方法)给出的。由此可以看出,CyclicBarrier 确实可以使得同一组的线程相互等待之后再同步向前运行;
且其计数器可以循环使用。