这是我参与更文挑战的第26天,活动详情查看: 更文挑战
前言
之前我们讲了java提供java.util.concurrent里的CyclicBarrier和CountDownLatch,感兴趣的可以回看一下 传送门:CountDownLatch原理介绍及使用场景,CyclicBarrier原理介绍及使用场景 今天我们讲一下java.util.concurrent工具类里的下一个工具Exchanger,Exchanger是Java提供的用于线程间进行通信、数据交换的多线程交互工具;
Exchanger
介绍:
Exchanger 是 JDK 1.5 开始提供的一个用于两个工作线程之间交换数据的封装工具类,简单说就是一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。
从定义来看Exchanger是用于线程间进行通信、数据交换。Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方。
public V exchange(V x) throws InterruptedException
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
V exchange(V v):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。V exchange(V v, long timeout, TimeUnit unit):等待另一个线程到达此交换点,或者当前线程被中断——抛出中断异常;又或者是等候超时——抛出超时异常,然后将给定的对象传送给该线程,并接收该线程的对象。
使用场景:
官方给出,可应用于基因算法、流水线设计等场景。基因算法其实解释起来比较有意思,也就是可以检验一下男A和女B俩个人的基因组合后可以生出来什么基因的小孩 普及一下生物小常识例如这样:
是不是很复合Exchanger的使用场景,哈哈哈哈哈!
ok!言归正传,我们今天举一个 我们日常工作中比较常见的例子来复现Exchanger的使用场景,举一个日常工作中较常见的场景 “找不同”,俩组数据对比是否有差异;
代码示例:
/**
* TODO
*
* @author taoze
* @version 1.0
* @date 6/25/21 4:06 PM
*/
public class ExchangerTest {
private static final Exchanger<String> exchanger = 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 = "12379871924sfkhfksdhfks";
exchanger.exchange(A);
} catch (InterruptedException e) {
}
}
});
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
String B = "32423423jknjkfsbfj";
String A = exchanger.exchange("B");
System.out.println("A和B数据是否一致:" + A.equals(B));
System.out.println("A= "+A);
System.out.println("B= "+B);
} catch (InterruptedException e) {
}
}
});
threadPool.shutdown();
}
}
运行结果:
我们这个只是简单的一个对比实现,大家有类似业务场景的话可以接入自己的业务中,例如对比俩个excel的内容,等等;
ok!今天的文章就到这了,以上就是Exchanger的简单使用方法,大家可以根据自身业务做修改,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;
整洁成就卓越代码,细节之中只有天地