Java并发工具之Exchanger线程间交换数据详解

 更新时间:2023年12月11日 09:30:25   作者:warybee  
这篇文章主要介绍了Java并发工具之Exchanger线程间交换数据详解,Exchanger是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交 换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,需要的朋友可以参考下

Exchanger简介

Exchanger是一个用于线程间协作的工具类。

Exchanger用于进行线程间的数据交 换。

它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。

这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange()方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产 出来的数据传递给对方

在这里插入图片描述

Exchanger使用介绍

Exchanger<T>用于在两个线程之间共享数据。该类仅提供一个重载方法exchange(T t),其中exchange(V x, long timeout, TimeUnit unit)方法可以指定阻塞超时时间,下面通过一个来理解两个线程之间交换数据:

public class ExchangerDemo {
    static Exchanger<String> exgr = new Exchanger<>();
    public static void main(String[] args) {
         Thread taskA=new Thread(()->{
             try {
                 String message = exgr.exchange("from A");
                 System.out.println("A Task===>"+ message);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         });
        Thread taskB=new Thread(()->{
            try {
                String message = exgr.exchange("from B");
                System.out.println("B Task===>"+ message);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        taskA.start();
        taskB.start();

    }
}

输出结果:

线程A,把数据传给了线程B,线程B,把数据传给了线程A

B Task===>from A
A Task===>from B

子线程与主线程间交换数据

public class ExchangerDemo2 {
    static Exchanger<String> exchanger = new Exchanger<>();
    public static void main(String[] args) throws InterruptedException {
        Runnable childTask = () -> {
            try {
                String message = exchanger.exchange("来自子线程的数据");
                System.out.println("子线程: "+message);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
        };
        //CompletableFuture java1.8中新增的异步编程类
        CompletableFuture<Void> result = CompletableFuture.runAsync(childTask);
        String msg = exchanger.exchange(" 来自主线程的数据");
        System.out.println("主线程: " +msg);
        result.join();
    }
}

输出结果:

子线程:  来自主线程的数据
主线程: 来自子线程的数据

到此这篇关于Java并发工具之Exchanger线程间交换数据详解的文章就介绍到这了,更多相关Exchanger线程间交换数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring-cloud-gateway启动踩坑及解决

    spring-cloud-gateway启动踩坑及解决

    这篇文章主要介绍了spring-cloud-gateway启动踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。
    2021-08-08
  • 深入理解Java中的Properties类

    深入理解Java中的Properties类

    Properties类是Java中用于处理配置文件的工具类,它继承自 Hashtable类,实现了Map接口,本文主要介绍了Java中的Properties类,感兴趣的可以了解一下
    2024-01-01
  • Java ConcurrentHashMap实现线程安全的代码示例

    Java ConcurrentHashMap实现线程安全的代码示例

    众所周知ConcurrentHashMap是HashMap的多线程版本,HashMap 在并发操作时会有各种问题,而这些问题,只要使用ConcurrentHashMap就可以完美解决了,本文将给详细介绍ConcurrentHashMap是如何保证线程安全的
    2023-05-05
  • 官方详解HDFS Balancer工具主要调优参数

    官方详解HDFS Balancer工具主要调优参数

    这篇文章主要为大家介绍了HDFS Balancer工具主要调优参数的 官方详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java简化复杂系统调用的门面设计模式

    Java简化复杂系统调用的门面设计模式

    Java门面模式是一种结构性设计模式,它为复杂系统提供了一个简单的接口,使得系统的客户端能够更加方便地使用系统功能。门面模式通过封装复杂的子系统,隐藏系统的实现细节,提高了系统的易用性和灵活性
    2023-04-04
  • Java创建对象(显式创建和隐含创建)

    Java创建对象(显式创建和隐含创建)

    本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况,显式创建和隐含创建,,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Java编写的24点纸牌游戏

    Java编写的24点纸牌游戏

    这篇文章主要介绍了Java编写的24点纸牌游戏的相关资料,需要的朋友可以参考下
    2015-03-03
  • Java启动参数从基础配置到高级调优(最新整理)

    Java启动参数从基础配置到高级调优(最新整理)

    文章系统讲解Java启动参数分类、内存管理配置、GC调优策略及生产环境实践,重点涵盖标准/非标准参数、堆/元空间/直接内存设置、G1/Parallel等回收器选择,并提供压缩指针、容器化部署等优化建议,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • SpringBoot 拦截器返回false显示跨域问题

    SpringBoot 拦截器返回false显示跨域问题

    这篇文章主要介绍了SpringBoot 拦截器返回false显示跨域问题,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-04-04
  • JAVA字符串占位符使用方法实例

    JAVA字符串占位符使用方法实例

    今天同事又问起类似符串占位符使用的功能,所以下面这篇文章主要给大家介绍了关于JAVA字符串占位符使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论