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实现生产者消费者的场景。线程