MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          CountDownLatch和CyclicBarrier的區別

          Posted on 2015-03-02 06:28 leekiang 閱讀(488) 評論(0)  編輯  收藏 所屬分類: java
          CountDownLatch : 一個線程(或者多個), 等待另外N個線程完成某個事情之后才能執行。? ?
          CyclicBarrier? : N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。
          這樣應該就清楚一點了,對于CountDownLatch來說,重點是那個“一個線程”, 是它在等待, 而另外那N的線程在把“某個事情”做完之后可以繼續等待,可以終止。而對于CyclicBarrier來說,重點是那N個線程,他們之間任何一個沒有完成,所有的線程都必須等待。

          CyclicBarrier 在釋放等待線程后可以重用,所以稱它為循環的 barrier。它 還支持一個可選的 Runnable 命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。



          public class Test {
          ??? public static void main(String[] args) {
          ??????? new Test().test1();
          ??? }
          ?? ?
          ??? public void test1() {
          ??????? CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
          ??????????? @Override
          ??????????? public void run() {
          ??????????????? System.out.println("所有玩家進入第二關!");
          ??????????? }
          ??????? });

          ??????? for (int i = 0; i < 4; i++) {
          ??????????? new Thread(new Player(i, cyclicBarrier)).start();
          ??????? }
          ??? }

          ??? class Player implements Runnable {
          ??????? private CyclicBarrier cyclicBarrier;
          ??????? private int id;

          ??????? public Player(int id, CyclicBarrier cyclicBarrier) {
          ??????????? this.cyclicBarrier = cyclicBarrier;
          ??????????? this.id = id;
          ??????? }

          ??????? @Override
          ??????? public void run() {
          ??????????? try {
          ??????????????? System.out.println("玩家" + id + "正在玩第一關...");
          ??????????????? cyclicBarrier.await();
          ??????????????? System.out.println("玩家" + id + "進入第二關...");
          ??????????? } catch (InterruptedException e) {
          ??????????????? e.printStackTrace();
          ??????????? } catch (BrokenBarrierException e) {
          ??????????????? e.printStackTrace();
          ??????????? }
          ??????? }
          ??? }
          }
          主站蜘蛛池模板: 大方县| 新龙县| 武安市| 沁阳市| 新建县| 忻州市| 渝北区| 景东| 黎川县| 合阳县| 马公市| 江山市| 安陆市| 营山县| 吴旗县| 五华县| 嘉禾县| 昆明市| 普安县| 利津县| 滁州市| 汾西县| 芷江| 威信县| 天门市| 盘锦市| 广河县| 商河县| 海晏县| 恩施市| 西城区| 英德市| 苏州市| 安多县| 青阳县| 永福县| 聂拉木县| 财经| 奇台县| 武安市| 临漳县|