java.util.concurrent.Exchanger 是jdk提供的一个线程通信工具,用以两个线程交换信息,它是阻塞型的,直到两个线程同时运行到交换信息处并且交换完成后才会继续运行,如下:
public class Demo {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Exchanger<String> ex = new Exchanger<>();
new Thread(()->{
try {
String str = ex.exchange("A");
System.out.println("线程A收到" + str+ "来信");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
String str = ex.exchange("B");
System.out.println("线程B收到" + str + "来信");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
运行结果为:
线程A收到B来信
线程B收到A来信
由于种种原因线程可能会产生异常,为防止发生死等的情况,该工具还提供了一个方法可设置等待时间
exchange(V x, long timeout, TimeUnit unit),当时间超时后会抛出TimeoutException