<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 :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

    非主流并發(fā)工具之 CyclicBarrier

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

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

    該類構造的時候除了必須要指定線程數(shù)量,還可以傳入一個 Runnable 對象,它的 run 方法將在到達公共屏障點后執(zhí)行一次。子線程完成計算后,分別調用 CyclicBarrier#await 方法進入阻塞狀態(tài),直到其他所有子線程都調用了 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. 兩者在構造的時候都必須指定線程數(shù)量,而且該數(shù)量在構造后不可修改。
    2. 前者可以傳入一個 Runnable 對象,在任務完成后自動調用,執(zhí)行者為某個子線程;后者可在 await 方法后手動執(zhí)行一段代碼實現(xiàn)相同的功能,但執(zhí)行者為主線程。
    3. 前者在每個子線程上都進行阻塞,然后一起放行;后者僅在主線程上阻塞一次。
    4. 前者可以重復使用;后者的倒計數(shù)器歸零后就作廢了。
    5. 兩者的內部實現(xiàn)完全不同。
    主站蜘蛛池模板: 国产亚洲美女精品久久久久狼| 免费成人高清在线视频| 亚洲免费二区三区| 亚洲三级电影网站| 亚洲视频在线免费观看| 国产亚洲无线码一区二区| www.av在线免费观看| 亚洲成?v人片天堂网无码| 亚洲七久久之综合七久久| 日韩免费a级毛片无码a∨| 亚洲最新中文字幕| 中文字幕无码不卡免费视频| 久久久无码精品亚洲日韩蜜桃| 在线免费观看伊人三级电影| 亚洲精品亚洲人成在线观看下载| 国产偷国产偷亚洲清高APP| 四虎永久在线精品视频免费观看| 亚洲va中文字幕| 亚洲成?Ⅴ人在线观看无码| 一区二区三区视频免费| 国产偷国产偷亚洲清高动态图 | 亚洲一级特黄特黄的大片 | 日韩中文字幕免费| 国产天堂亚洲精品| 中文字幕亚洲一区| 在线免费观看国产| 亚洲AV无码专区在线电影成人| 国产精品视_精品国产免费| 高清免费久久午夜精品| 亚洲色成人中文字幕网站| 99爱视频99爱在线观看免费| 久久久久亚洲Av无码专| 欧美最猛性xxxxx免费| 亚洲av无码专区在线电影天堂| 亚洲乱码中文字幕手机在线 | 国产成人精品无码免费看| 亚洲成综合人影院在院播放| 免免费国产AAAAA片| 亚洲日本va一区二区三区| 亚洲综合另类小说色区色噜噜| 国产好大好硬好爽免费不卡|