1. 程式人生 > >JUC之CyclicBarrier迴圈避障

JUC之CyclicBarrier迴圈避障

舉例說明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.跑分測試          ……

注:本人多執行緒一欄的文章大多為簡記、後續時間充裕了再回頭進行豐富。

宣告:本文是學習筆記,主要學習自以下視訊微笑學習視訊            《Java多執行緒與併發實戰視訊課程》,齊毅 微笑
如有不當之處,歡迎指正微笑本文已經被收錄進《程式設計師成長筆記(三)》,筆者JustryDeng