码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发编程-关卡

时间:2015-11-09 01:29:02      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

CyclicBarrier 直译过来叫循环栅栏,它主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。在这之后,如果再次调用 await() 方法,计数就又会变成 N-1,新一轮重新开始,这便是 Cyclic 的含义所在。

CyclicBarrier 的使用并不难,但需要主要它所相关的异常。除了常见的异常,CyclicBarrier.await() 方法会抛出一个独有的 BrokenBarrierException。这个异常发生在当某个线程在等待本 CyclicBarrier 时被中断或超时或被重置时,其它同样在这个 CyclicBarrier 上等待的线程便会受到 BrokenBarrierException。意思就是说,同志们,别等了,有个小伙伴已经挂了,咱们如果继续等有可能会一直等下去,所有各回各家吧。

CyclicBarrier.await() 方法带有返回值,用来表示当前线程是第几个到达这个 Barrier 的线程。

和 CountDownLatch 一样,CyclicBarrier 同样可以可以在构造函数中设定总计数值。与 CountDownLatch 不同的是,CyclicBarrier 的构造函数还可以接受一个 Runnable,会在 CyclicBarrier 被释放时执行。

[java]
public class CyclicBarrierTest {

		public static void main(String[] args) throws IOException, InterruptedException {
			//如果将参数改为4,但是下面只加入了3个选手,这永远等待下去
			//Waits until all parties have invoked await on this barrier.
			CyclicBarrier barrier = new CyclicBarrier(3);

			ExecutorService executor = Executors.newFixedThreadPool(3);
			executor.submit(new Thread(new Runner(barrier, "1号选手")));
			executor.submit(new Thread(new Runner(barrier, "2号选手")));
			executor.submit(new Thread(new Runner(barrier, "3号选手")));

			executor.shutdown();
		}
	}

	class Runner implements Runnable {
		// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
		private CyclicBarrier barrier;

		private String name;

		public Runner(CyclicBarrier barrier, String name) {
			super();
			this.barrier = barrier;
			this.name = name;
		}

		@Override
		public void run() {
			try {
				Thread.sleep(1000 * (new Random()).nextInt(8));
				System.out.println(name + " 准备好了...");
				// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
				barrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
			System.out.println(name + " 起跑!");
		}
	}
[/java]

CountDownLatch 适用于一组线程和另一个主线程之间的工作协作。一个主线程等待一组工作线程的任务完毕才继续它的执行是使用 CountDownLatch 的主要场景;CyclicBarrier 用于一组或几组线程,比如一组线程需要在一个时间点上达成一致,例如同时开始一个工作。另外,CyclicBarrier 的循环特性和构造函数所接受的 Runnable 参数也是 CountDownLatch 所不具备的。

Java并发编程-关卡

标签:

原文地址:http://www.cnblogs.com/suxuan/p/4948752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!