Exchanger
简介
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。
当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行
方法列表
exchanger.exchange(x);
exchanger.exchange(x, timeout, unit)
示例代码(java 1.8)
public class ExchangeDemo {
private String var;
public ExchangeDemo(String var) {
super();
this.var = var;
}
@Override
public String toString() {
return "ExchangeDemo [var=" + var + "]";
}
public static void main(String[] args) {
Exchanger<ExchangeDemo> exchanger = new Exchanger<>();
AtomicInteger ai = new AtomicInteger();
for (int i = 0; i < 2; i++) {
new Thread(()->{
int num = ai.incrementAndGet();
ExchangeDemo exchangeDemo = new ExchangeDemo(String.valueOf(num));
try {
System.out.println(String.format("thread:%s begin exchange from %s", num, exchangeDemo.toString()));
ExchangeDemo temp = exchanger.exchange(exchangeDemo);
System.out.println(String.format("thread:%s end exchange got %s", num, temp.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
输出结果
thread:1 begin exchange from ExchangeDemo [var=1]
thread:2 begin exchange from ExchangeDemo [var=2]
thread:1 end exchange got ExchangeDemo [var=2]
thread:2 end exchange got ExchangeDemo [var=1]
参考博文
参考博文