非主流並發工具之 Exchanger – JAVA編程語言程序開發技術文章

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();  www.aiwalls.com

運行結果(可能為):

線程 [9] 算出 abc
線程 [10] 算出 xyz
線程 [10] 收到 abc
線程 [9] 收到 xyz
最後強調下,該類隻適用於兩個線程,妄圖用它來處理多個生產者和消費者之間的數據交換是註定要失敗的……

 摘自 神奇好望角 The Magical Cape of Good Hope
 
 
 

發佈留言