/**
* Main barrier code, covering the various policies.
*/
private int dowait(boolean timed, long nanos)
throws InterruptedException, BrokenBarrierException,
TimeoutException {
final ReentrantLock lock = this.lock;
lock.lock();
try {
final Generation g = generation;
if (g.broken)
throw new BrokenBarrierException();
…………………………………………
}
SHOW ME CODE
package JUC;
import lombok.SneakyThrows;
import java.awt.*;
import java.util.concurrent.CyclicBarrier;
/**
* @authoryuanxindong
* @date: 2020/6/18 11:53 下午
*/
public class CyclicBarrierDemo implements Runnable{
private int timeOut ;
private CyclicBarrier cyclicBarrier;
public void setTimeOut(int timeOut) {
this.timeOut = timeOut;
}
public static class innerCyclicBarrierDemo implements Runnable{
@Override
public void run() {
System.out.println("最后执行的方法+");
}
}
public CyclicBarrierDemo(int timeOut,CyclicBarrier cyclicBarrier) {
this.timeOut = timeOut;
this.cyclicBarrier = cyclicBarrier;
}
public static void main(String[] args) {
// 启用一个CyclicBarrier,然后进行加载。
CyclicBarrier cyclicBarrier =new CyclicBarrier(3,new innerCyclicBarrierDemo());
long startTime = System.currentTimeMillis();
CyclicBarrierDemo cyclicBarrierDemo = new CyclicBarrierDemo(1000,cyclicBarrier);
Thread thread = new Thread(cyclicBarrierDemo);
CyclicBarrierDemo cyclicBarrierDemo2 = new CyclicBarrierDemo(2000,cyclicBarrier);
Thread thread1 = new Thread(cyclicBarrierDemo2);
CyclicBarrierDemo cyclicBarrierDemo3 = new CyclicBarrierDemo(3000,cyclicBarrier);
Thread thread2 = new Thread(cyclicBarrierDemo3);
thread.start();
thread1.start();
thread2.start();
System.out.println("所有线程执行结束执行时间:"+(System.currentTimeMillis() -startTime));
}
@SneakyThrows
@Override
public void run() {
System.out.println("开始执行:「」"+Thread.currentThread().getName()+System.currentTimeMillis());
Thread.sleep(timeOut);
long watingTime = System.currentTimeMillis();
System.out.println("等待:「」"+Thread.currentThread().getName()+watingTime);
cyclicBarrier.await();
System.out.println("完成:「」"+Thread.currentThread().getName() +" time: "+ (System.currentTimeMillis()-watingTime));
}
}
执行结果
开始执行:「」Thread-01592752948830
开始执行:「」Thread-11592752948830
所有线程执行结束执行时间:2
开始执行:「」Thread-21592752948831
等待:「」Thread-01592752949833
等待:「」Thread-11592752950835
等待:「」Thread-21592752951836
最后执行的方法+
完成:「」Thread-2 time: 0
完成:「」Thread-0 time: 2003
完成:「」Thread-1 time: 1001
Disconnected from the target VM, address: '127.0.0.1:58105', transport: 'socket'
Process finished with exit code 0