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

          CountDownLatch和CyclicBarrier的區(qū)別

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

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



          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("所有玩家進(jìn)入第二關(guān)!");
          ??????????? }
          ??????? });

          ??????? 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 + "正在玩第一關(guān)...");
          ??????????????? cyclicBarrier.await();
          ??????????????? System.out.println("玩家" + id + "進(jìn)入第二關(guān)...");
          ??????????? } catch (InterruptedException e) {
          ??????????????? e.printStackTrace();
          ??????????? } catch (BrokenBarrierException e) {
          ??????????????? e.printStackTrace();
          ??????????? }
          ??????? }
          ??? }
          }
          主站蜘蛛池模板: 武定县| 陇川县| 康乐县| 虹口区| 时尚| 武山县| 宣威市| 苏尼特左旗| 探索| 包头市| 长丰县| 重庆市| 离岛区| 左权县| 江都市| 盖州市| 饶河县| 裕民县| 隆德县| 伊吾县| 开封市| 芦山县| 九江市| 成安县| 府谷县| 滁州市| 大同市| 平南县| 彩票| 年辖:市辖区| 曲周县| 曲靖市| 和平区| 进贤县| 嘉禾县| 永登县| 财经| 冀州市| 柘荣县| 政和县| 漳浦县|