Exchanger
Exchanger从名字也可以看出,用于进行线程间的数据交换。他提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,如果一个线程先执行了exchange()方法,他会一直等待第二个线程也执行到exchange()方法,然后进行交换数据。
应用场景
遗传算法
,遗传算法例需要选出两个人作为交配对象,只是后会交换两人的数据,并使用交叉规则得出两人交配结果。
校对工作
:比如我们需将纸质的银行流水账单痛殴人工方式登记到电子银行的流水账单,为了避免错误,可以两个人同时登记同一份账单,录入到系统,对两个人的记录进行对比看是否一致。
来个栗子
import java.util.concurrent.*;
/**
* @author fitz.bai
*/
public class MyThread17 {
private static Exchanger<String> exchanger;
public static void main(String[] args) {
exchanger = new Exchanger<>();
InnerClass aThread = new InnerClass(exchanger, "aaa");
InnerClass bThread = new InnerClass(exchanger, "bbb");
aThread.start();
bThread.start();
}
static class InnerClass extends Thread {
private Exchanger<String> exchanger;
private String data;
public InnerClass(Exchanger<String> exchanger, String data) {
this.exchanger = exchanger;
this.data = data;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "启动, 原数据为" + data + ", 时间为" + System.currentTimeMillis());
Thread.sleep(1000);
data = exchanger.exchange(data);
System.out.println(Thread.currentThread().getName() + "开始交换数据, 交换后的数据为" + data + ", 时间为" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 运行结果
Thread-0启动, 原数据为aaa, 时间为1533644272603
Thread-1启动, 原数据为bbb, 时间为1533644272604
Thread-0开始交换数据, 交换后的数据为bbb, 时间为1533644273694
Thread-1开始交换数据, 交换后的数据为aaa, 时间为1533644273694
结论:
结果一目了然