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线程间交换数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解@AliasFor注解的使用与注意事项

    详解@AliasFor注解的使用与注意事项

    @AliasFor注解是在spring源码当中提供的,见名知义,他是为了别名而自定义的注解,下面我们来看看它的使用与注意事项,感兴趣的小伙伴可以了解一下
    2023-08-08
  • java Object wait方法详细介绍

    java Object wait方法详细介绍

    这篇文章主要介绍了java Object wait方法详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • java教程散列表和树所对应容器类及HashMap解决冲突学习

    java教程散列表和树所对应容器类及HashMap解决冲突学习

    本篇篇文章是java教程,主要介绍了java教程散列表,树所对应容器类及HashMap解决冲突的学习,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • java网上图书商城(3)Book模块

    java网上图书商城(3)Book模块

    这篇文章主要为大家详细介绍了java网上图书商城,Book模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Golang Protocol Buffer案例详解

    Golang Protocol Buffer案例详解

    这篇文章主要介绍了Golang Protocol Buffer案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java编程FinalReference与Finalizer原理示例详解

    java编程FinalReference与Finalizer原理示例详解

    这篇文章主要为大家介绍了java编程FinalReference与Finalizer的核心原理以及示例源码的分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • SpringBoot+kaptcha实现图片验证码功能详解

    SpringBoot+kaptcha实现图片验证码功能详解

    这篇文章主要为大家详细介绍了SpringBoot如何结合kaptcha实现图片验证码功能,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-01-01
  • Java套接字(Socket)网络编程入门

    Java套接字(Socket)网络编程入门

    这篇文章主要介绍了Java套接字(Socket)网络编程入门,Socket可以理解为是对TCP/IP协议的抽象,需要的朋友可以参考下
    2015-10-10
  • SpringBoot集成FTP与SFTP连接池流程

    SpringBoot集成FTP与SFTP连接池流程

    在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了SpringBoot集成FTP与SFTP连接池
    2022-12-12
  • Java使用selenium爬取b站动态的实现方式

    Java使用selenium爬取b站动态的实现方式

    本文主要介绍了Java使用selenium爬取b站动态的实现方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论