CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等
待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
使用场景如:需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。具体参考下面的例子:(注意CyclicBarrier构造函数中的线程数,那就是需要等待的线程数目,若exec.submit少提交一个线程,则程序将会阻塞。)
package com.mythread.test;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestCyclicBarrier {
public static void main(String args[]) {
CyclicBarrier barrier = new CyclicBarrier(3, new Action());
ExecutorService exec = Executors.newFixedThreadPool(3);
exec.submit(new Thread(new Test(barrier, "first")));
exec.submit(new Thread(new Test(barrier, "second")));
exec.submit(new Thread(new Test(barrier, "third")));
exec.shutdown();
}
}
class Test implements Runnable{
private CyclicBarrier barrier;
private String name;
public Test(CyclicBarrier barrier, String name) {
super();
this.barrier = barrier;
this.name = name;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000*(new Random()).nextInt(8));
System.out.println(name + " ready go...");
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(name + " Run!");
}
}
class Action implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("All is ready!");
}
}
运行结果:
first ready go...
third ready go...
second ready go...
All is ready!
second Run!
first Run!
third Run!