CyclicBarrier工具类主要是控制多个线程的一起执行,CyclicBarrier 实例可以多次使用。
演示程序:
import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * * CyclicBarrier和CountDownLatch功能类似,都可以用作在所有线程都做好准备(比如赛跑: * 每一个运动员可以认为是一个线程,只有当所有运动员做好准备才能鸣枪开始跑)之后一起触发运行。 * * 但是也有区别: * 1:CountDownLatch(初始值为线程个数)需要每当一个线程准备好之后,调用一下countDown方法,告诉CountDownLatch又有一个线程已经完成准备,当CountDownLatch值为0时候则触发所有线程一起执行 * 2:CyclicBarrier(初始值为线程个数)需要每当一个线程准备好之后运行时候会阻塞在await处,当所有线程都阻塞在await处时候,即可触发所有线程执行。(CyclicBarrier:可以循环使用,每当触发完毕一次之后还可以 * 再次使用该CyclicBarrier的实例对象) */public class CyclicBarrierDemo { public static void main(String[] args) throws Exception { /** * 重复使用的CyclicBarrier对象实例 */ CyclicBarrier c = new CyclicBarrier(3); startThread(c); //第一次使用CyclicBarrier示例 Thread.sleep(5 * 1000); startThread(c); Thread.sleep(5 * 1000); startThread(c); } /** * * @param c 重复使用的CyclicBarrier对象实例 */ public static void startThread(CyclicBarrier c) { Thread t1 = newThread("t1", c); Thread t2 = newThread("t2", c); Thread t3 = newThread("t3", c); t1.start(); t2.start(); t3.start(); } public static Thread newThread(final String threadName, final CyclicBarrier c) { return new Thread(new Runnable() { @Override public void run() { try { int time = new Random().nextInt(3); System.out.println(threadName + " sleep " + time + "秒 。"); Thread.sleep(time * 1000); c.await(); //当所有线程都阻塞在此处时候触发所有线程执行 System.out.println(threadName + " is running ."); } catch (InterruptedException | BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }, threadName); }}