先上一个小demo
public class Main {
public static void main(String[] args) throws InterruptedException {
Exchanger<String> exchanger=new Exchanger<String>();
People li=new People("小李家","铁锹",exchanger);
People gang =new People("小刚家","锤子",exchanger);
li.start();
gang.start();
Thread.sleep(100);
System.out.println(li.getName()+" has " +li.getTool());
System.out.println(gang.getName()+" has "+gang.getTool());
}
static class People extends Thread{
private String tool;
private final Exchanger<String> exchanger;
public People(String name,String tool,Exchanger<String> exchanger){
super(name);
this.tool=tool;
this.exchanger=exchanger;
}
@Override
public void run() {
//交换工具
try {
tool=exchanger.exchange(tool);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public String getTool() {
return tool;
}
}
}
输出结果:

首先新建一个People类去继承自Thread,并在main方法里面初始化了两个People,一个起名为小李家,拥有铁锹,另一个起名为小刚家,拥有铁锹,经过exchange之后,两者的tool发生了交换;
在这里面,exchanger对象并不在乎是哪两个线程发生交换,只要有一个线程率先执行到exchange方法,exchanger对象一端就确定为它,之后他将进行阻塞,直到紧接着的一个线程执行到同一个的exchanger的exchange方法,其阻塞状态消除,发生交换,方法的参数是当前线程想要交换出去的item,返回值是想交换进来的item,在一次完整的exchange调用结束后,exchanger之后任然可用,可以再进行下一次交换;
虽然看似要求很多,但是部份你是可以消除的,比如你想实现就是特定几个线程之间的交换,建议是继承Exchanger类并重写exchange方法;想控制交换时延,考虑其exchange重载方法:
exchanger.exchange(String,long,TimeUnit)
至于想控制异常抛出或处理,请移步我的另一篇文章
本文通过一个示例深入解析Java并发工具Exchanger的工作原理。Exchanger允许两个线程进行双向数据交换,当一个线程调用exchange方法时,会等待另一个线程也调用同一Exchanger对象的exchange方法,从而完成数据交换。文章展示了如何使用Exchanger实现线程间的工具交换,并介绍了如何控制交换时延及异常处理。
741

被折叠的 条评论
为什么被折叠?



