CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用
CyclicBarrier和CountDownLatch有相似之处是都要等某组任务完成才能执行某个操作, 不同之处是CountDownLatch是进行减法,而CyclicBarrier是进行加法,写例子最好说明:
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Runnable() {
@Override
public void run() {
System.out.println(" 开会了,关于项目的功能分析");
}
});
Person p = new Person(cyclicBarrier);
Thread t1 = new Thread(p,"java后台");
Thread t2 = new Thread(p,"测试人员");
Thread t3 = new Thread(p,"项目经理");
Thread t4 = new Thread(p,"设计师");
Thread t5 = new Thread(p,"Android程序员");
List<Thread> threadList = new ArrayList<>();
threadList.add(t1);
threadList.add(t2);
threadList.add(t3);
threadList.add(t4);
threadList.add(t5);
for(Thread thread:threadList){
thread.start();
}
}
}
class Person implements Runnable{
private CyclicBarrier cyclicBarrier;
public Person(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
int random = (int)(1+Math.random()*2000);
Thread.sleep(random);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"进入会议室");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
结果:
java后台进入会议室
测试人员进入会议室
Android程序员进入会议室
项目经理进入会议室
设计师进入会议室
开会了,关于项目的功能分析