Exchanger是一個用於線程間數據交換的工具類,它提供一個公共點,在這個公共點,兩個線程能夠交換彼此的數據。ide
當一個線程調用exchange方法後將進入等待狀態,直到另一個線程調用exchange方法,雙方完成數據交換後繼續執行。工具
exchange(V x):阻塞當前線程,直到另一個線程調用exchange方法或者當前線程被中斷。線程
exchange(V x, long timeout, TimeUnit unit):阻塞當前線程,直到另一個線程調用exchange方法或者當前線程被中斷或者等待超時。對象
exchange方法正常狀況返回交換到的對象,噹噹前線程被中斷或者等待超時時,exchange方法返回null。string
public class Demo { public static void main(String[] args) { ExchangerstringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { try { String dataA = "A同窗收藏多年的大片"; String dataB = stringExchanger.exchange(dataA); System.out.println("A同窗獲得了" + dataB); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread studentB = new Thread(() -> { try { String dataB = "B同窗收藏多年的大片"; String dataA = stringExchanger.exchange(dataB); System.out.println("B同窗獲得了" + dataA); } catch (InterruptedException e) { e.printStackTrace(); } }); studentA.start(); studentB.start(); } } /* * 輸出結果: * B同窗獲得了A同窗收藏多年的大片 * A同窗獲得了B同窗收藏多年的大片 */
public class Demo { public static void main(String[] args) { ExchangerstringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { String dataB = null; try { String dataA = "A同窗收藏多年的大片"; //最多等待5秒 dataB = stringExchanger.exchange(dataA, 5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException ex){ System.out.println("等待超時-TimeoutException"); } System.out.println("A同窗獲得了" + dataB); }); studentA.start(); } } /* * 輸出結果: * 等待超時-TimeoutException * A同窗獲得了null */