java Exchanger类用于在线程之间传输数据
class ExchangeOne implements Runnable{
Exchanger<String> exchanger;
public ExchangeOne(Exchanger<String> exchanger){
this.exchanger=exchanger;
}
@Override
public void run() {
try {
String one="one";
System.out.println("thread id:"+Thread.currentThread().getId()+",before value:one,date:"+new Date());
String afterValue=exchanger.exchange(one);
System.out.println("thread id:"+Thread.currentThread().getId()+",after value:"+afterValue+",date:"+new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ExchangeTwo implements Runnable{
Exchanger<String> exchanger;
public ExchangeTwo(Exchanger<String> exchanger){
this.exchanger=exchanger;
}
@Override
public void run() {
try {
Thread.sleep(2000);
String one="two";
System.out.println("thread id:"+Thread.currentThread().getId()+",before value:two,date:"+new Date());
String afterValue=exchanger.exchange(one);
System.out.println("thread id:"+Thread.currentThread().getId()+",after value:"+afterValue+",date:"+new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Exchanger<String> exchanger=new Exchanger<>();
new Thread(new ExchangeOne(exchanger)).start();
new Thread(new ExchangeTwo(exchanger)).start();
}
执行结果:
thread id:11, before value:one, date:Wed Jul 19 16:07:15 GMT+08:00 2017
thread id:12, before value:two, date:Wed Jul 19 16:07:17 GMT+08:00 2017
thread id:12, after value:one, date:Wed Jul 19 16:07:17 GMT+08:00 2017
thread id:11, after value:two, date:Wed Jul 19 16:07:17 GMT+08:00 2017
thread11第一次运行时 second是 15,交换数据后是 17, 因为 thread12休眠了2秒