神奇好望角 The Magical Cape of Good Hope

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

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

          Posted on 2011-12-27 10:50 蜀山兆孨龘 閱讀(1520) 評論(0)  編輯  收藏 所屬分類: Java SE

          Exchanger 用來讓兩個線程互相等待并交換計算結(jié)果。這個類的用法很簡單,因為它就定義了兩個重載的 exchange 方法,參數(shù)多的那個無非增加了對超時的支持。當(dāng)一個線程調(diào)用 exchange 的時候(以計算結(jié)果作為參數(shù)),它就開始等待另一個線程調(diào)用 exchange,然后兩個線程分別收到對方調(diào)用 exchange 時傳入的參數(shù),從而完成了計算結(jié)果的交換。

          不用太多的解釋,運行下面這個例子就一清二楚:

          final Exchanger<String> e = new Exchanger<>();
          
          new Thread() {
              @Override
              public void run() {
                  long id = Thread.currentThread().getId();
                  String s = "abc";
                  System.out.println("線程 [" + id + "] 算出 " + s);
          
                  try {
                      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
                      System.out.println("線程 [" + id + "] 收到 " + e.exchange(s));
                  } catch (InterruptedException ex) {
                      ex.printStackTrace();
                  }
              }
          }.start();
          
          new Thread() {
              @Override
              public void run() {
                  long id = Thread.currentThread().getId();
                  String s = "xyz";
                  System.out.println("線程 [" + id + "] 算出 " + s);
          
                  try {
                      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
                      System.out.println("線程 [" + id + "] 收到 " + e.exchange(s));
                  } catch (InterruptedException ex) {
                      ex.printStackTrace();
                  }
              }
          }.start();
              

          運行結(jié)果(可能為):

          線程 [9] 算出 abc
          線程 [10] 算出 xyz
          線程 [10] 收到 abc
          線程 [9] 收到 xyz

          最后強調(diào)下,該類只適用于兩個線程,妄圖用它來處理多個生產(chǎn)者和消費者之間的數(shù)據(jù)交換是注定要失敗的……

          主站蜘蛛池模板: 东港市| 门头沟区| 济南市| 贺州市| 邹城市| 武强县| 长岭县| 鸡西市| 大冶市| 浦江县| 大同县| 岐山县| 内黄县| 佳木斯市| 保亭| 南澳县| 阿合奇县| 正宁县| 贵溪市| 高邑县| 洱源县| 宝坻区| 尼木县| 体育| 竹山县| 桑日县| 长宁区| 漯河市| 南宫市| 桐庐县| 潜山县| 威信县| 左贡县| 南投县| 云和县| 新绛县| 顺平县| 静宁县| 称多县| 六枝特区| 合江县|