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<String> 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
posted on 2020-08-20 10:12 shumeigang 阅读(148) 评论(0) 收藏 举报
浙公网安备 33010602011771号