结论:Exchanger只能是两个线程交换数据吗?那三个调⽤同⼀个实例的exchange⽅法会发⽣什么呢?答案是只有前两个线程会交换数据,第三个线程会进⼊阻塞状态。
上代码:
public class ExchangerDemo {
public static void main(String[] args) throws InterruptedException {
Exchanger<String> exchanger = new Exchanger<>();
new Thread(() -> {
try {
System.out.println("这是线程A,得到了另⼀个线程的数据:"
+ exchanger.exchange("这是来⾃线程A的数据"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println("这个时候线程A是阻塞的,在等待线程B的数据");
Thread.sleep(1000);
new Thread(() -> {
try {
System.out.println("这是线程B,得到了另⼀个线程的数据:"
+ exchanger.exchange("这是来⾃线程B的数据"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
Thread.sleep(1000);
new Thread(() -> {
try {
System.out.println("这是线程C,得到了另⼀个线程的数据:"
+ exchanger.exchange("这是来⾃线程X的数据"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
输出:
这个时候线程A是阻塞的,在等待线程B的数据
这是线程B,得到了另⼀个线程的数据:这是来⾃线程A的数据
这是线程A,得到了另⼀个线程的数据:这是来⾃线程B的数据