Java并发编程之CyclicBarrier

版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/butterfly5211314/article/details/83115947

CyclicBarrier可以控制这样的场景:
对多个线程,他们执行自己代码(运行run方法)的时间不一样;
比如有3个线程,其run方法执行时间分别为1s, 2s, 3s。如果我们想在三个线程都完成自己的任务时执行相应的操作,CyclicBarrier就派上用场了。

写了一个简单的测试类,方便理解:

package cn.demo;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
	private static int workerCount = 3; // 3个工人
	private static CyclicBarrier barrier;

	// Worker类, 其中的run方法表示在做任务
	static class Worker implements Runnable {

		@Override
		public void run() {
			try {
				Thread.sleep(new Random().nextInt(1000)); // 工人(当前线程)做完自己的任务经历的时间
				System.out.println(Thread.currentThread().getName() + "做完了任务, 到达barrier,等待其他人。");

				barrier.await(); // 工人(当前线程)在barrier前等待其他工人做完任务
				
				System.out.println(Thread.currentThread().getName() + "继续做自己的事情");
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
//		 barrier = new CyclicBarrier(workerCount);

		// new CyclicBarrier(int parties, Runnable barrierAction)
		// 表示第parties个(也就是最后一个)线程到达barrier时,触发barrierAction(也就是里边的run方法)
		barrier = new CyclicBarrier(workerCount, new Runnable() {
			@Override
			public void run() {
				System.out.println("最后一个完成任务的人:" + Thread.currentThread().getName());
			}
		});
		for (int i = 0; i < workerCount; i++) {
			new Thread(new Worker()).start();
		}
	}
}

可能的输出结果:

Thread-1做完了任务, 到达barrier,等待其他人。
Thread-2做完了任务, 到达barrier,等待其他人。
Thread-0做完了任务, 到达barrier,等待其他人。
最后一个完成任务的人:Thread-0
Thread-0继续做自己的事情
Thread-1继续做自己的事情
Thread-2继续做自己的事情

可以用图表示为:

时间:------------------------------------>
--------------------barrier---------------
					|
T0	 	            |
T1                  |
T2                  |
	 	            |
	 	          T1| // 线程1先到,等待其他线程
	 	       T2   |
	 	   T0       |
	 	            |
	 	          T1| // 线程2也到了,由于3个人没齐,线程1和2都在等
	 	          T2|
	 	      T0    |
	 	            |
	 	            T1 // 3个人都到了,放开屏障(barrier)
	 	            T2
	 	            T0

参考:
https://www.cnblogs.com/skywang12345/p/3533995.html

欢迎补充指正!

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/83115947
今日推荐