本文目录

  • 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线程间交换数据相关推荐

  1. Java并发编程--6.Exchanger线程间交换数据

    在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中 在生产者-消费者情境模式中它包含了一个数缓冲区 ...

  2. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  3. Java多线程研究(八)使用Exchange在多个线程间交换数据

    比如生活中两个人,一个人有零食,另一个人有钱,他们两个想等价交换,对好口号在某个地方相见,一个人先到了之后,必须等另一个人带着需要的东西来了之后,才能开始hi交换. 代码: import java.u ...

  4. java面试-Java并发编程(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  5. Java高并发编程(十):Java并发工具类

    1. 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. 1.1 应用场景 假如有这样一个需求:我们需要解析一个Excel里多个shee ...

  6. 线程同步工具(七)在并发任务间交换数据

    声明:本文是< Java 7 Concurrency Cookbook >的第三章, 作者: Javier Fernández González 译者:郑玉婷 在并发任务间交换数据 Jav ...

  7. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据

    1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...

  8. java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题

    先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...

  9. java 多个线程共享数据_【java并发】多个线程间共享数据

    先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...

最新文章

  1. 面试题:请用代码实现ip地址与int之间互换?
  2. 关于line-height的一些理解
  3. **52.常用的存储保护方法有哪些?
  4. [Android]Space控件的应用场景
  5. LoRaWAN开放式实验平台
  6. Android基础——数据存储
  7. 微博热榜排行榜zset
  8. 【NOIP-2017PJ】图书管理员
  9. 页面自适应纯CSS,使用rem单位
  10. 设计模式 (七) 适配器模式
  11. Visual Studio安装及无法打开包括文件: “crtdbg.h”问题解决
  12. 微信小程序连接蓝牙汉印HM-A300L标签打印机
  13. 【Linux集群教程】11 集群监控 - Zabbix 搭建
  14. 什么是TF-IDF?
  15. ⚓写写5G网速及页面提速中的延迟加载Lazyloading
  16. 法兰克机器人外部自动_(完整版)KUKA机器人外部自动配置方法
  17. STM32——SDIO简介
  18. Cordova 环境搭建+打包Android APK
  19. Python接口下载文件
  20. ps web格式 html 大小写,PS教程:图片存储为Web所用格式优化详解

热门文章

  1. Mesh组网之单线复用与VLAN网口复用
  2. 电脑怎么直接给服务器传文件夹,教你电脑怎么传文件夹给qq好友
  3. 0xC0000005: 读取位置 0x00000001 时发生访问冲突
  4. dmp标签_[重磅推荐]你必须知道的京准通DMP知识!
  5. Oracle导入dmp数据
  6. HTTP中200、302、304、404和500等响应状态码含义
  7. 基于Python回归模型的异方差性分析
  8. 如何使用cleanmymac文件粉碎机
  9. java为什么有基本类型_你了解Java数据类型吗?
  10. 主机升级rsyslog后服务异常分析,rsyslog服务重启报错