Exchanger
(交
换
者)是一个用于
线
程
间协
作的工具
类
。
Exchanger
用于
进
行
线
程
间
的数据交
换
。它提供一个同步点,在
这
个同步点,两个
线
程可以交
换
彼此的数据。
这
两个
线
程通
过
exchange
方法交
换
数据,如果第一个
线
程先
执
行
exchange()
方法,它会一直等待第二个
线
程也
执
行
exchange
方法,当两个
线
程都到达同步点
时
,
这
两个
线
程就可以交
换
数据,将本
线
程生
产
出来的数据
传递给对
方。
一个同步点,线程可以在该点配对和交换配对中的元素。每个线程在{@link#exchange}方法的条目上呈现一些对象,与伙伴线程匹配,并在返回时接收其伙伴的对象。交换器可以看作是{@link SynchronousQueue}的双向形式。交换器在遗传算法和管道设计等应用中可能很有用
应用场景:
Exchanger
可以用于
遗传
算法
,
遗传
算法里需要
选
出两个人作
为
交配
对
象,
这时
候会交
换
两人的数据,并使用交叉
规则
得出
2
个交配
结
果。
Exchanger
也可以用于校
对
工作
,比如我
们
需
要将
纸
制
银
行流水通
过
人工的方式
录
入成
电
子
银
行流水,
为
了避免
错误
,采用
AB
岗
两人
进
行
录
入,
录
入到
Excel
之后,系
统
需要加
载这
两个
Excel
,并
对
两个
Excel
数据
进
行校
对
,看看是否
录
入一致
package com.netty.obj.demo5.d3;
import java.util.concurrent.Exchanger;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @PackageName:com.netty.obj.demo5.d3 Description
* @author:
* @date:2022/1/12
*/
public class ExchangerTest {
private static final Exchanger<String> exgr = new Exchanger<String>();
private static ExecutorService threadPool =Executors.newFixedThreadPool(2);
public static void main(String[] args) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
String A = "银行流水A";
// A录入银行流水数据
exgr.exchange(A);
} catch (InterruptedException e) {
}
}
});
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
String B = "银行流水B";
// B录入银行流水数据
String A = exgr.exchange("B");
System.out.println("A和B数据是否一致:" + A.equals(B) + ",A录入的是:"
+ A + ",B录入是:" + B);
} catch (InterruptedException e) {
}
}
});
threadPool.shutdown();
}
}
如果两个
线
程有一个没有
执
行
exchange()
方法,
则
会一直等待,如果担心有特殊情况
发
生,避免一直等待,可以使用
exchange
(
V x
,
longtimeout
,
TimeUnit unit
)
设
置最大等待
时长
。
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/70587ceb9cab8412ed558b1a854eef7e.png)
总结:本案例摘自《Java并发编程的艺术》,加深并发工具的理解,希望在业务开发中有帮助