Exchanger
用来让两个线程互相等待并交换计算结果。这个类的用法很简单,因为它就定义了两个重载的 exchange
方法,参数多的那个无非增加了对超时的支持。当一个线程调用 exchange
的时候(以计算结果作为参数),它就开始等待另一个线程调用 exchange
,然后两个线程分别收到对方调用 exchange
时传入的参数,从而完成了计算结果的交换。
不用太多的解释,运行下面这个例子就一清二楚:
final Exchanger<String> e = new Exchanger<>();
new Thread() {
@Override
public void run() {
long id = Thread.currentThread().getId();
String s = "abc";
System.out.println("线程 [" + id + "] 算出 " + s);
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
System.out.println("线程 [" + id + "] 收到 " + e.exchange(s));
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}.start();
new Thread() {
@Override
public void run() {
long id = Thread.currentThread().getId();
String s = "xyz";
System.out.println("线程 [" + id + "] 算出 " + s);
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
System.out.println("线程 [" + id + "] 收到 " + e.exchange(s));
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}.start();
运行结果(可能为):
线程 [9] 算出 abc
线程 [10] 算出 xyz
线程 [10] 收到 abc
线程 [9] 收到 xyz
最后强调下,该类只适用于两个线程,妄图用它来处理多个生产者和消费者之间的数据交换是注定要失败的……