JUC之CyclicBarrier迴圈避障
阿新 • • 發佈:2018-12-15
舉例說明CyclicBarrier迴圈避障: 遊樂園水上划船,規定5個人劃一艘船,如果人不夠,那麼就需要等待,直到湊齊5個人了,才允許開始。也就是說,5個人一波5個人一波。每一波都是同一時間開始玩的。
即:迴圈避障保證了多個執行緒在準確的同一刻開始。
注:CyclicBarrier迴圈避障適用於多執行緒必須同時開始的情景。
程式碼示例
import java.util.Date; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 迴圈避障 示例 * * @author JustryDeng * @date 2018/10/17 19:39 */ public class CyclicBarrierDemo { /** 設定迴圈避障數 */ private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5); public static void main(String[] args) throws InterruptedException { // -> 建立可快取長執行緒池 ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 1; i <= 10; i++) { Thread.sleep(1000); // 使用lambel表示式簡單實現Runnable介面的run方法 executorService.execute(() -> { try { System.out.println(new Date() + "執行緒" + Thread.currentThread().getName() + "準備就緒!"); // 設定避障點 cyclicBarrier.await(); System.out.println(new Date() + "執行緒" + Thread.currentThread().getName() + "開始執行!"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }); } // 關閉執行緒池 executorService.shutdown(); } }
執行主函式,輸出結果為:
注:await(long timeout, TimeUnit unit)方法可以設定一個超時時間,如果等待超時了,那麼會丟擲異常;其它同組等待的執行緒 就知道不需要等了,沒有結果的。
注:CyclicBarrier常用場景有(舉例說明): 1.雙十一00:00分秒殺 2.準點搶票 3.跑分測試 ……
注:本人多執行緒一欄的文章大多為簡記、後續時間充裕了再回頭進行豐富。