CyclicBarrier [ˈsaɪklɪk] [ˈbæriər]:栅栏,它能够将一组线程阻塞,直到指定的所有线程同时到达栅栏位置,才能继续执行后续操作,否则就处在等待状态。
我们示例里这样使用,实例化一个CyclicBarrier并定义线程数量,在执行需要的线程并执行cyclicBarrier.await()进行阻塞操作,定义的线程数量达到cyclicBarrier的数量,则可以进入CyclicBarrier的run方法执行后续操作。
主要方法是cyclicBarrier.await(),所有的线程都在此处等待着,没有达到一定数量就会等待,所有的数量到了栅栏位置立马将栅栏打开,并释放所有的线程。
代码如下:
/**
* @Author df
* @Date 2022/5/27 14:36
* @Version 1.0
*
* Cyclic :[ˈsaɪklɪk]
* barrier : [ˈbæriər]
* juc的CyclicBarrier的示例:
* CyclicBarrier可以等待所有的线程都处理完毕,才继续执行CyclicBarrier里方法
* 所有的线程都通过await()处集合等待,当所有线程都到达以后才继续
* CyclicBarrier是等待线程处理,其他的相似的如CountDownLatch和信号量都是等待事件处理才处理
*/
public class CyclicBarrierDemo {
public static void main(String[] args) {
int cyclicBarrierNum = 10;
CyclicBarrier cyclicBarrier = new CyclicBarrier(cyclicBarrierNum, new Runnable() {
// 只有10个线程都到达await时则直接进入此run方法
@Override
public void run() {
System.out.println("所需要的线程都到了,可以开始干了!");
}
});
// 提交10个线程
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < cyclicBarrierNum; i++) {
exec.execute(new TaskThread(cyclicBarrier));
}
exec.shutdown();
}
static class TaskThread implements Runnable {
private CyclicBarrier cyclicBarrier;
public TaskThread(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
// 在此处集合等着
try {
System.out.println(Thread.currentThread().getName() + "在这里等候!");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
运行结果
Executors.newCachedThreadPool()这里把newCachedThreadPool换成newSingleThreadExecutor则会一直阻塞,一个线程达不到目的