java多執行緒學習——CyclicBarrier
阿新 • • 發佈:2019-01-23
一、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(); } }