神奇好望角 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

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

          主站蜘蛛池模板: 威宁| 延津县| 巴南区| 乌拉特前旗| 东乡| 瑞丽市| 资溪县| 佳木斯市| 原阳县| 东兴市| 屏东县| 彰武县| 晋江市| 阳山县| 安徽省| 越西县| 绥江县| 高雄县| 腾冲县| 宜昌市| 淮阳县| 井冈山市| 林甸县| 鸡东县| 金昌市| 南城县| 边坝县| 乌兰浩特市| 临高县| 丹东市| 临沂市| 台安县| 儋州市| 景谷| 绍兴市| 澄江县| 古浪县| 荃湾区| 塘沽区| 玉屏| 南和县|