与 CountDownLatch 不同的是,CyclicBarrier 的计数器可以循环使用,当所有线程都到达屏障点后,计数器会重置,可以被复用
package com.jysemel.java.lock;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierDemo {
private static final CyclicBarrier barrier= new CyclicBarrier(5,new Runnable() {
@Override
public void run() {
System.out.println("已经就绪,可以出发了");
}
});
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int threadNum = i;
Thread.sleep(1000);
executor.execute(() -> {
try {
race(threadNum);
} catch (Exception e) {
System.out.println("----------------");
}
});
}
executor.shutdown();
}
private static void race(int threadNum) throws Exception {
Thread.sleep(1000);
System.out.println("就绪----------------" + threadNum);
barrier.await();
System.out.println("启程----------------" + threadNum);
}
}
多个线程分阶段执行任务,每个阶段结束后等待其他线程,然后一起执行下一个阶段。
多个线程同时执行不同任务,等待所有任务完成后再进行下一步操作。
代码