Java多线程CyclicBarrier学习

Java多线程CyclicBarrier学习

      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个橘子装箱完成!

猜你喜欢

转载自injavawetrust.iteye.com/blog/2361388