<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    神奇好望角 The Magical Cape of Good Hope

    庸人不必自擾,智者何需千慮?
    posts - 26, comments - 50, trackbacks - 0, articles - 11
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    非主流并發工具之 CyclicBarrier

    Posted on 2011-10-17 11:21 蜀山兆孨龘 閱讀(1792) 評論(0)  編輯  收藏 所屬分類: Java SE

    CyclicBarrier 的功能類似于前面說到的 CountDownLatch,用于讓多個線程(子任務)互相等待,直到共同到達公共屏障點(common barrier point),在這個點上,所有的子任務都已完成,從而主任務完成。

    該類構造的時候除了必須要指定線程數量,還可以傳入一個 Runnable 對象,它的 run 方法將在到達公共屏障點后執行一次。子線程完成計算后,分別調用 CyclicBarrier#await 方法進入阻塞狀態,直到其他所有子線程都調用了 await

    下面仍然以運動員準備賽跑為例來說明 CyclicBarrier 的用法:

                final int count = 8;
                System.out.println("運動員開始就位。");
    
                final CyclicBarrier cb = new CyclicBarrier(count, new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("比賽開始...");
                    }
                });
    
                for (int i = 1; i <= count; i++) {
                    final int number = i;
                    new Thread() {
                        @Override
                        public void run() {
                            System.out.println(number + " 號運動員到場并開始準備...");
                            try {
                                // 準備 2~5 秒鐘。
                                TimeUnit.SECONDS.sleep(new Random().nextInt(4) + 2);
                            } catch (InterruptedException ex) {
                            }
                            System.out.println(number + " 號運動員就位。");
                            try {
                                cb.await();
                            } catch (InterruptedException | BrokenBarrierException ex) {
                            }
                        }
                    }.start();
                }
                System.out.println("等待所有運動員就位...");
        

    運行輸出(可能)為:

    運動員開始就位。
    1 號運動員到場并開始準備...
    2 號運動員到場并開始準備...
    等待所有運動員就位...
    3 號運動員到場并開始準備...
    4 號運動員到場并開始準備...
    6 號運動員到場并開始準備...
    8 號運動員到場并開始準備...
    5 號運動員到場并開始準備...
    7 號運動員到場并開始準備...
    1 號運動員就位。
    3 號運動員就位。
    8 號運動員就位。
    6 號運動員就位。
    2 號運動員就位。
    7 號運動員就位。
    5 號運動員就位。
    4 號運動員就位。
    比賽開始...

    最后看看 CyclicBarrierCountDownLatch 的主要異同:

    1. 兩者在構造的時候都必須指定線程數量,而且該數量在構造后不可修改。
    2. 前者可以傳入一個 Runnable 對象,在任務完成后自動調用,執行者為某個子線程;后者可在 await 方法后手動執行一段代碼實現相同的功能,但執行者為主線程。
    3. 前者在每個子線程上都進行阻塞,然后一起放行;后者僅在主線程上阻塞一次。
    4. 前者可以重復使用;后者的倒計數器歸零后就作廢了。
    5. 兩者的內部實現完全不同。
    主站蜘蛛池模板: 久久精品国产精品亚洲蜜月| 亚洲熟妇av午夜无码不卡| 最近2022中文字幕免费视频| 亚洲大片免费观看| 亚洲高清无码在线观看| 国产午夜不卡AV免费| 亚洲乱码在线观看| 亚洲伊人久久精品影院| 日本免费一区二区在线观看| 曰批全过程免费视频免费看| 久久精品国产亚洲av麻豆| 妞干网免费观看视频| 91视频免费观看| 亚洲av中文无码乱人伦在线观看| 亚洲精品中文字幕无码蜜桃| 麻豆成人精品国产免费| 久草免费手机视频| 日韩a毛片免费观看| 亚洲春色另类小说| 亚洲人成精品久久久久| 成人性生免费视频| 久久99国产综合精品免费| 日本精品久久久久久久久免费| 亚洲一级毛片免费在线观看| 中文字幕在亚洲第一在线| 嫩草影院在线免费观看| 99久久久国产精品免费蜜臀| 水蜜桃视频在线观看免费| 亚洲喷奶水中文字幕电影| 亚洲精品美女久久久久99| 国产在线观看免费视频播放器| 67194国产精品免费观看| 一级女性全黄生活片免费看| 亚洲午夜无码毛片av久久京东热| 亚洲AV无码国产精品色午友在线 | 男女交性永久免费视频播放| 久久一区二区三区免费播放| 日韩a毛片免费观看| 亚洲国产精品嫩草影院| 亚洲成a人片在线观看中文app| 久久被窝电影亚洲爽爽爽|