ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java多线程实战——Exchanger原理介绍及使用场景

2021-06-26 20:51:43  阅读:203  来源: 互联网

标签:场景 Java exchange 线程 Exchanger 多线程 public


 

0f0fb0ca11ae3346b91625d0fb92e485.jpeg

前言

今天我们讲一下java.util.concurrent工具类里的下一个工具Exchanger,Exchanger是Java提供的用于线程间进行通信、数据交换的多线程交互工具;

16004dfc46b567e1e7d7658e65bb7907.png

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俩个人的基因组合后可以生出来什么基因的小孩 普及一下生物小常识例如这样:

1aae1853da7c897751a807ae6bae554c.png

是不是很复合Exchanger的使用场景,哈哈哈哈哈!

587d0b4885d9c87b6223f784b0621db6.png

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();

    }
}

运行结果:

d1a5b4c6954c709821d685fd024c6017.png

我们这个只是简单的一个对比实现,大家有类似业务场景的话可以接入自己的业务中,例如对比俩个excel的内容,等等;

最后:

最近我整理了整套《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

Java进阶之路群,找管理员获取哦-!

1d5dbc68b9ea3595bf9850de8d2a076e.pngd779a7191ae07d418f846b96bbdd4d83.png

标签:场景,Java,exchange,线程,Exchanger,多线程,public
来源: https://blog.51cto.com/u_15219958/2949895

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有