这里只介绍CyclicBarrier的使用和场景,源码后期再分解
CyclicBarrier可以理解为一个珊栏,定义了这个珊栏后,必须要达到一定条件珊栏才可以打开,让所有线程跑起来。可重复使用。
CyclicBarrier两个重要的方法:
public int await() //调用的线程被挂起,知道满足珊栏的条件
public int await(long timeout, TimeUnit unit) //调用的线程被挂起,知道满足珊栏的条件或者时间达到传入的值
下面简单的代码实例:
public class MyCyclicBarrier {
public static void main(String[] args) {
CyclicBarrier c = new CyclicBarrier(3);//初始化条件为三个线程到达珊栏,才可以执行
ExecutorService e = Executors.newCachedThreadPool();
e.submit(()->{
try {
System.out.println("Thread-"+Thread.currentThread().getName()+"到达珊栏");
c.await();//第1个线程等待
Thread.sleep(1000);
System.out.println("Thread-"+Thread.currentThread().getName()+"满足条件,执行");
} catch (Exception e1) {
e1.printStackTrace();
}
});
e.submit(()->{
try {
System.out.println("Thread-"+Thread.currentThread().getName()+"到达珊栏");
c.await();//第2个线程等待
Thread.sleep(1000);
System.out.println("Thread-"+Thread.currentThread().getName()+"满足条件,执行");
} catch (Exception e1) {
e1.printStackTrace();
}
});
e.submit(()->{
try {
System.out.println("Thread-"+Thread.currentThread().getName()+"到达珊栏");
c.await();//第3个线程等待
Thread.sleep(1000);
System.out.println("Thread-"+Thread.currentThread().getName()+"满足条件,执行");
} catch (Exception e1) {
e1.printStackTrace();
}
});
e.shutdown();
}
}
执行结果:
这里使用的jdk1.8的写法()->