Java中的并发工具类之线程间交换数据的Exchanger

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 置最大等待 时长
输出结果:

 总结:本案例摘自《Java并发编程的艺术》,加深并发工具的理解,希望在业务开发中有帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值