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