1. 程式人生 > >java多執行緒學習——CyclicBarrier

java多執行緒學習——CyclicBarrier

一、CyclicBarrier的介紹:

一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。

二、CyclicBarrier使用場景:

如幾個旅遊團組織旅遊,旅遊團的旅遊路線分別是廣州→深圳→北京→麗江→香格里拉。旅遊團中有自駕遊、徒步和乘坐巴士,這些旅遊團同時出發,並且每到一個地方需等待其它旅遊團到達此地後再同時出發,知道到達香格里拉結束。

三、用CyclicBarrier來小試身手:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCyclicBarrier {
	//從廣州→深圳→北京→麗江→香格里拉
	//乘坐巴士時間
	private static int[] busTime = {2,13,7,20};
	//徒步時間
	private static int[] walkTime = {5,20,13,30};
	//自駕遊時間
	private static int[] selfTime = {1,10,5,15};
	//獲取到達時間
	static String getReachedTime(){
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		return sdf.format(new Date()) + ":";
	}
	static class Tour implements Runnable{
		//時間
		int[] times;
		//旅遊團型別名稱
		String name;
		CyclicBarrier cyclicBarrier;
		
		public Tour(CyclicBarrier cyclicBarrier,String name,int[] times){
			this.cyclicBarrier = cyclicBarrier;
			this.name = name;
			this.times = times;
		}
		
		@Override
		public void run() {
			try {
				Thread.sleep(times[0] * 1000);
				System.out.println(getReachedTime() + name + "到達深圳。");
				cyclicBarrier.await();
				Thread.sleep(times[1] * 1000);
				System.out.println(getReachedTime() +name + "到達北京。");
				cyclicBarrier.await();
				Thread.sleep(times[2] * 1000);
				System.out.println(getReachedTime() + name + "到達麗江。");
				cyclicBarrier.await();
				Thread.sleep(times[3] * 1000);
				System.out.println(getReachedTime() + name + "到達香格里拉。");
				cyclicBarrier.await();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	public static void main(String[] args) {
		//3個旅遊團
		CyclicBarrier barrier = new CyclicBarrier(3);
		ExecutorService es = Executors.newFixedThreadPool(3);
		es.submit(new Tour(barrier,"WalkTour",walkTime));
		es.submit(new Tour(barrier,"BusTour",busTime));
		es.submit(new Tour(barrier,"SelfTour",selfTime));
		es.shutdown();
	}
}