CyclicBarrier是一个同步工具类:等待一组线程都达到某个状态时,继续执行,否则共同等待。
new CyclicBarrier(int count):构造一个CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动。
线程阻塞:await():判断当前的CyclicBarrier计数器是否为0,如果等于0,则表示所有的线程准备就绪,唤醒所有等待的线程。
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CyclicBarrierTest {
public static void main(String[] args) {
//定义CyclicBarrier,当5个人同时到达时,发车
final CyclicBarrier cb = new CyclicBarrier(5);
ExecutorService executor = Executors.newCachedThreadPool();
for(int i=0;i<5;i++) {
final int offset = i;
executor.execute(new Runnable() {
@Override
public void run() {
try {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));
System.out.println("乘客-"+offset+"-到达车站#"+Thread.currentThread().getName());
//查看其它乘客是否到达,没有则当前线程阻塞进行等待。
cb.await();
System.out.println("准备开车:乘客-"+offset+"-已经上车#"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}
}