神奇好望角 The Magical Cape of Good Hope

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

          非主流并發工具之 Exchanger

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

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

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

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

          運行結果(可能為):

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

          最后強調下,該類只適用于兩個線程,妄圖用它來處理多個生產者和消費者之間的數據交換是注定要失敗的……

          主站蜘蛛池模板: 观塘区| 佛坪县| 交城县| 贡觉县| 甘孜县| 广昌县| 元江| 运城市| 株洲县| 玉龙| 磴口县| 富宁县| 昭苏县| 股票| 保定市| 肇源县| 宁阳县| 颍上县| 南昌县| 樟树市| 抚远县| 曲周县| 达拉特旗| 内丘县| 嵩明县| 贞丰县| 册亨县| 秦皇岛市| 浮山县| 长武县| 齐齐哈尔市| 乌审旗| 信阳市| 石泉县| 七台河市| 固原市| 二连浩特市| 三穗县| 昆明市| 同德县| 阿拉善盟|