Exchanger

1、概念

     Exchanger(交换者)是一个用于线程间协作的工具类。

     Exchanger 用于进行线程的数据交换。

     Exchanger 提供一个同步点,在这个同步点,两个线程 可以交换 彼此的数据

    只能是2个线程,他不支持更多的线程之间互换数据

   当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行

 

2 Exchanger的应用场景

Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致

 

3实列代码

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyExchangerTest {

public static void main(String[] args) {
Exchanger exchanger = new Exchanger<>();
ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(new Runnable() {
@Override
public void run() {
try {


String strA=exchanger.exchange("A");
System.out.println("strA:"+strA+" "+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
executor.submit(new Runnable() {
@Override
public void run() {
try {


String strB=exchanger.exchange("B");
System.out.println("strB:"+strB+" "+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
executor.shutdown();
}
}

结果:

strA:B pool-1-thread-1
strB:A  pool-1-thread-2

你可能感兴趣的:(Exchanger)