Exchanger
用來讓兩個線程互相等待并交換計算結果。這個類的用法很簡單,因為它就定義了兩個重載的 exchange
方法,參數(shù)多的那個無非增加了對超時的支持。當一個線程調用 exchange
的時候(以計算結果作為參數(shù)),它就開始等待另一個線程調用 exchange
,然后兩個線程分別收到對方調用 exchange
時傳入的參數(shù),從而完成了計算結果的交換。
不用太多的解釋,運行下面這個例子就一清二楚:
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
最后強調下,該類只適用于兩個線程,妄圖用它來處理多個生產(chǎn)者和消費者之間的數(shù)據(jù)交換是注定要失敗的……