1、什么是Exchanger?
Exchanger 顾名思义它是交互器,交换什么呢?怎么交换?是不是一堆小问号,下面一 一来解答,交换的是线程之间的数据,调用Exchanger.exchange(V x)方法就能交互。
2、使用案例:
public class ExchangerDemo {
static Exchanger<String> exchanger = new Exchanger <>();
public static void main(String[] args) {
String t1String = "T1";
String t2String = "T2";
new Thread(()->{
try {
System.out.println("T1交换之前的值:" + t1String);
String exchange = exchanger.exchange(t1String);
System.out.println("T1交换之后的值:" + exchange);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T1").start();
new Thread(()->{
try {
System.out.println("T2交换之前的值:" + t2String);
String exchange = exchanger.exchange(t2String);
System.out.println("T2交换之后的值:" + exchange);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"T2").start();
}
}
案例输出:T1交换之前的值:T1
T2交换之前的值:T2
T2交换之后的值:T1
T1交换之后的值:T2
丛输出结果可以看出T1、T2线程实现了数据交换,当T1线程调用exchanger.exchange(t1String)的时候就表示它把t1String拿出来跟其他线程做交换,当有T2调用exchanger.exchange(t2String)的时候就表示把t2String拿出来跟其他线程做交互,当有两条线程要做交换的时候,Exchanger就满足了交换的条件,就会进行值的交换,并且把交换后的值返回。
3、使用注意点:
1、需要交换值的线程必须是成对的出现。
2、当有两条线程将值交换完成后,Exchanger实例可重复使用,其他线程也可以使用此Exchanger实例来进行数据交换。
4、Exchanger的实现原理:
Exchanger交换值的原理是使用了ThreadLocal来实现的,至于线程阻塞的部分是使用java中的Usafe类park()/unpark()来实现的。