java.util.concurrent.Exchanger用於兩個線程之間傳遞數據,而且只限於兩個線程。該類經過exchange()方法進行線程之間的數據交換。線程A在調用exchange()方法以後會被阻塞,直到有線程B調用了exchange()方法。注意,這個的Exchanger對象爲同一個。java
public class ThreadA extends Thread { private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger) { super(); this.exchanger = exchanger; } @Override public void run() { try { System.out.println("線程A中獲得線程B的數據" + exchanger.exchange("ThreadA")); System.out.println("ThreadA end!"); } catch (InterruptedException e) { e.printStackTrace(); } } }
public class Run { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<String>(); ThreadA a = new ThreadA(exchanger); a.start(); System.out.println("ThreadMain end!"); } }
運行Run,System.out.println("線程A中獲得線程B的數據" + exchanger.exchange("ThreadA"));沒有被輸出,由於此時就一個線程調用了exchange()方法,線程被阻塞。運行結果以下:ide
public class ThreadB extends Thread { private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger) { super(); this.exchanger = exchanger; } @Override public void run() { try { System.out.println("線程B中獲得線程A的數據" + exchanger.exchange("ThreadB")); System.out.println("ThreadA end!"); } catch (InterruptedException e) { e.printStackTrace(); } } }
public class Run { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<String>(); ThreadA a = new ThreadA(exchanger); ThreadB b = new ThreadB(exchanger); a.start(); b.start(); } }
運行結果以下:this
根據上面的演示咱們很容易用Exchanger實現生產者消費者的場景。線程