CyclicBarrier的await方法会阻塞当前线程,只有当被阻塞的线程数达到了CyclicBarrier初始化的线程数时,才会同一时间唤醒所有线程。
1、需要一个任务类
public class CyclicBarrierTask implements Runnable {
private CyclicBarrier cyclicBarrier;
private String name;
private long rest;
public CyclicBarrierTask(CyclicBarrier cyclicBarrier, String name, long rest) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
this.rest = rest;
}
@Override
public void run() {
try {
Thread.sleep(rest);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("我是" + name + ", 当前时间" + System.currentTimeMillis());
}
}
public class CyclicBarrierClient {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(4);
new Thread(new CyclicBarrierTask(barrier, "张三", 2000)).start();
new Thread(new CyclicBarrierTask(barrier, "李四", 3000)).start();
new Thread(new CyclicBarrierTask(barrier, "王五", 1000)).start();
new Thread(new CyclicBarrierTask(barrier, "刘二", 6000)).start();
}
}
我是刘二, 当前时间1506274029403
我是王五, 当前时间1506274029403
我是张三, 当前时间1506274029404
我是李四, 当前时间1506274029404