CyclicBarrier用法
CyclicBarrier是所有线程都到了指定的个数,才开始执行下边的代码。
public class CyclicBarrierDemo {
// private static String[] arr = {"小王","小张","小李","小赵","小丽","小陈","小孙","小郭","小吴","小钱"};
private static String[] arr = {"小王","小张","小李","小赵","小丽"};
public static void main(String[] args)throws Exception{
changjing();
}
public static void changjing()throws Exception{
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Runnable() {
@Override
public void run() {
System.out.println("5人已来,可以开席了");
}
});
for (int i = 0; i < 10; i++) {
final int index = i;
Thread.sleep(1000);
new Thread(()->{
try {
System.out.println(arr[index] + "要来了");
cyclicBarrier.await();
System.out.println(arr[index] + "开始吃了");
} catch (Exception e) {
}
},"线程" + i).start();
}
}
}
- 输出的结果(5个人都执行到了await方法,然后就可以执行run方法了,之后就可以执行之后的代码了)
小王要来了
小李要来了
小赵要来了
小张要来了
小丽要来了
5人已来,可以开席了
小丽开始吃了
小王开始吃了
小赵开始吃了
小张开始吃了
小李开始吃了
重点
这个跟CountdownLatch不一样的是,CountdownLatch是一次性的,而CycliBarrier是可以重复使用的,只需调用一下reset方法。
CountDownLatch与CyclicBarrier
CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:
CountDownLatch一般用于一个或多个线程,等待其他线程执行完任务后,再才执行
CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行
另外,CountDownLatch是减计数,计数减为0后不能重用;而CyclicBarrier是加计数,可置0后复用。