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