概念
循环栅栏。工作线程必须等待其它线程都到达后才能够继续。 这就好比500米短跑比赛, 3跑道必须等到3人都到齐后才能开始赛跑。
与CountDownLatch区别
- CountDownLatch 的使用场景更多的是侧重于主线程-从线程协调工作
而CyclicBarrier侧重的是多个从线程之间的协调工作
示例代码
5个线程都到齐后才会开始工作。
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(5, new Runnable(){
public void run(){
System.out.println("---have---");
}
});
final Work work = new Work(cb);
for(int i=0; i<11; i++){
Thread t = new Thread(new Runnable(){
public void run(){
work.doStaff();
}
});
t.start();
}
}
static class Work{
private CyclicBarrier barrier;
public Work(CyclicBarrier c){
this.barrier = c;
}
public void doStaff(){
System.out.println(Thread.currentThread().getName() + " will waiting...");
try {
barrier.await();
} catch (Exception e) {}
System.out.println(Thread.currentThread().getName() + " do task done...");
}
}
}