一.简介
Exchanger就是交换者的意思,用于之间线程间协作交换彼此数据,其核心依靠一个exchange(V v)方法,当两个线程调用exchange方法时候,会将传入的数据传递给彼此,当其中一个线程到达exchange方法时,另一个线程还没到达exchange,则此线程阻塞到另一个线程执行exchange,就是说Exchanger提供一个同步点,在这个同步点上交换彼此的数据。如果另一个线程不想一直等待可以使用exchanger(V v,long timeout,TimeUnit unit)方法。
二.代码实现
/**
* @author m969130721@163.com
* @date 18-12-6 上午9:30
*/
public class ExchangerDemo {
public static void main(String[] args) {
Exchanger exchanger = new Exchanger();
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(() -> {
String a = "a";
try {
String result = (String) exchanger.exchange(a);
System.out.println("a 交换数据了" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
service.execute(() -> {
String b = "b";
try {
String result = (String) exchanger.exchange(b);
System.out.println("b 交换数据了" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
运行结果:
三.适用场景
仅适用于两个线程之间交换数据,如可用于遗传算法,遗传算法需要选出两个人作为交配对象,需要交换两个的数据。