CyclicBarrier是多线程并发控制实用工具
- CyclicBarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。
- await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
- CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
- CyclicBarrier可以接收一个参数作为barrierAction,就是当计数器一次计算完成后,程序会执行的动作。
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @author InJavaWeTrust * */ public class Orange { public static class PickOrange implements Runnable { private int i; private CyclicBarrier cb; public PickOrange(int i, CyclicBarrier cb) { this.i = i; this.cb = cb; } public void run() { try { pick(); cb.await(); // 等待所有橘子采摘完毕 box(); cb.await(); // 等待所有橘子装箱完毕 } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } public void pick() { System.out.println("采摘第" + i +"个橘子完成!"); } public void box() { System.out.println("第" + i + "个橘子装箱完成!"); } } public static void main(String[] args) { CyclicBarrier cb = new CyclicBarrier(5); ExecutorService exec = Executors.newFixedThreadPool(5); for (int i = 1; i <= 5; i++) { exec.submit(new Thread(new PickOrange(i, cb))); } exec.shutdown(); } }
结果:
采摘第2个橘子完成! 采摘第1个橘子完成! 采摘第5个橘子完成! 采摘第4个橘子完成! 采摘第3个橘子完成! 第3个橘子装箱完成! 第2个橘子装箱完成! 第1个橘子装箱完成! 第5个橘子装箱完成! 第4个橘子装箱完成!