System.out.println(“主线程==end”);
}
}
输出结果:
这个t1和t2的输出结果是随机的。
CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier- Action),用于在线程到达屏障时,优先执行barrierAction。
[](()CyclicBarrier使用示例2
package com.zwx.concurrent.jucUtil;
import java.util.concurrent.CyclicBarrier;
public class CyclicbarrierDemo2 {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(2,new MyThread());
public static void main(String[] args) {
new Thread(()-> {
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(“我是线程t1”);
},“t1”).start();
new Thread(()-> {
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(“我是线程t2”);
},“t2”).start();
System.out.println(“主线程==end”);
}
static class MyThread extends Thread {
@Override
public void run() {
System.out.println(“do something”);
}
}
}
输出结果:
我们可以看到,在线程t1和t2输出前会先输出自定义线程的信息。
[](()CyclicBarrier实现原理
CyclicBarrier 相比 CountDownLatch 来说,要简单很多,源码实现是基于 ReentrantLock 和 Condition 的组合使用
[](()CyclicBarrier源码分析
[](()CyclicBarrier(parties)
进入CyclicBarrier默认构造器:
可以发现,最终其实还是调用的CyclicBarrier(int parties,Runnable barrier