神奇好望角 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 蜀山兆孨龘 閱讀(1521) 評論(0)  編輯  收藏 所屬分類: Java SE

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

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

          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();
              

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

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

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

          主站蜘蛛池模板: 沾益县| 讷河市| 滨州市| 澄迈县| 菏泽市| 寻甸| 达州市| 玉门市| 旅游| 昌图县| 阿拉善左旗| 弥勒县| 常宁市| 崇阳县| 太仆寺旗| 巴林右旗| 凉城县| 贺州市| 松江区| 黔西| 南京市| 砚山县| 廊坊市| 商水县| 汶川县| 潞城市| 集安市| 嘉荫县| 义马市| 梓潼县| 阿克| 大安市| 长治市| 五常市| 泰州市| 九台市| 康平县| 安多县| 江北区| 光泽县| 长丰县|