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