文章目录

  • 简介
  • 类定义
  • 类继承
  • 构造函数
  • 两个主要方法
  • 具体的例子
  • 结语

简介

Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。

两个线程都调用exchange方法之后,传入的参数就会交换。

类定义

public class Exchanger<V>

其中V表示需要交换的对象类型。

类继承

java.lang.Object
↳ java.util.concurrent.Exchanger<V>

Exchanger直接继承自Object。

构造函数

Exchanger()

Exchanger提供一个无参构造函数。

两个主要方法

  1. public V exchange(V x) throws InterruptedException

当这个方法被调用的时候,当前线程将会等待直到其他的线程调用同样的方法。当其他的线程调用exchange之后,当前线程将会继续执行。

在等待过程中,如果有其他的线程interrupt当前线程,则会抛出InterruptedException。

  1. public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

和第一个方法类似,区别是多了一个timeout时间。如果在timeout时间之内没有其他线程调用exchange方法,则会抛出TimeoutException。

具体的例子

我们先定义一个带交换的类:

@Data
public class CustBook {private String name;
}

然后定义两个Runnable,在run方法中调用exchange方法:

@Slf4j
public class ExchangerOne implements Runnable{Exchanger<CustBook> ex;ExchangerOne(Exchanger<CustBook> ex){this.ex=ex;}@Overridepublic void run() {CustBook custBook= new CustBook();custBook.setName("book one");try {CustBook exhangeCustBook=ex.exchange(custBook);log.info(exhangeCustBook.getName());} catch (InterruptedException e) {e.printStackTrace();}}
}
@Slf4j
public class ExchangerTwo implements Runnable{Exchanger<CustBook> ex;ExchangerTwo(Exchanger<CustBook> ex){this.ex=ex;}@Overridepublic void run() {CustBook custBook= new CustBook();custBook.setName("book two");try {CustBook exhangeCustBook=ex.exchange(custBook);log.info(exhangeCustBook.getName());} catch (InterruptedException e) {e.printStackTrace();}}
}

最后在主方法中调用:

public class ExchangerUsage {public static void main(String[] args) {Exchanger<CustBook> exchanger = new Exchanger<>();// Starting two threadsnew Thread(new ExchangerOne(exchanger)).start();new Thread(new ExchangerTwo(exchanger)).start();}
}

我们看下结果:

22:14:09.069 [Thread-1] INFO com.flydean.ExchangerTwo - book one
22:14:09.073 [Thread-0] INFO com.flydean.ExchangerOne - book two

可以看到对象已经被交换了。

结语

Exchanger在两个线程需要交换对象的时候非常好用。大家可以在实际工作生活中使用。

本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com

java并发Exchanger的使用相关推荐

  1. java并发实战编程pdf_「原创」Java并发编程系列25 | 交换器Exchanger

    2020年Java面试题库连载中 [000期]Java最全面试题库思维导图 [001期]JavaSE面试题(一):面向对象 [002期]JavaSE面试题(二):基本数据类型与访问修饰符 [003期] ...

  2. exchange java对象,【原】Java并发程序的一个应用Exchanger的实例

    [原]Java并发程序的一个使用Exchanger的实例 今天看了些Exchanger的资料,有个喝水的例子不错.我这里细化了以下,并得到实现. 思路: 有一个Drinker和一个Waiter,有两个 ...

  3. Java并发工具类(三)Exchanger

    Java并发工具类(三)Exchanger 在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有: CountDownLatch Sema ...

  4. Java并发编程题库

    文章目录 并发编程三要素? 实现可见性的方法有哪些? 创建线程的有哪些方式? 创建线程的三种方式的对比? Runnable 和 Callable 的区别 Java线程具有五中基本状态 什么是线程池?有 ...

  5. java 并发实例_java一些常用并发工具示例

    最近把<java并发编程实战>-Java Consurrency in Practice 重温了一遍,把书中提到的一些常用工具记录于此: 一.闭锁(门栓)- CountDownLatch ...

  6. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  7. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

    多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...

  8. 死磕Java并发:J.U.C之阻塞队列:ArrayBlockingQueue

    作者:chenssy 来源:Java技术驿站 ArrayBlockingQueue,一个由数组实现的有界阻塞队列.该队列采用FIFO的原则对元素进行排序添加的. ArrayBlockingQueue为 ...

  9. Java并发编程-并发工具包java.util.concurrent使用指南

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurren ...

最新文章

  1. C# 4.0 新特性之并行运算(Parallel)
  2. DFT实训教程笔记2(bibili版本)- Scan synthesis practice
  3. AOL、WebEx共同开发新AIM即时通讯
  4. matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
  5. 一套存储承载全场景,XSKY星辰天合发布企业级SDS V5系列
  6. sqlite3用python家外键_Django/Sqlite3为带有外键的模型添加一行
  7. ssrs 级联参数_在SSRS中使用多值参数
  8. AmS中的一些重要调度相关变量
  9. 计算机网络基础系列(二)计算机网络体系结构
  10. linux用户个人的环境变量,linux下的变量以及系统和个人环境变量的配置文件
  11. jsencrypt php,js加密php解密(一)
  12. cmos sensor camera banding 现象发生原因及相关问题
  13. [渝粤教育] 华中科技大学 模拟电子技术基础 参考 资料
  14. [搞笑]后舍男生视频
  15. 【某集训题解】【DAY 2 T3】与非
  16. 计算机网络---广域网及相关协议
  17. 网站推广工具易推宝是什么?
  18. 正确理解UNICODE UTF-8等编码方式
  19. 有shsh/plist,不知道如何转shsh2?只需要4步
  20. 六元均匀直线阵的各元间距为_天线原理考试卷B.doc

热门文章

  1. 机器学习-聚类之K均值(K-means)算法原理及实战
  2. H.264码流结构解析
  3. 木马开机启动的六种方法
  4. 1_3 SingletonMode 单例模式
  5. Python的列表List常见操作
  6. Netty学习笔记(一)Netty客户端源码分析
  7. 《深入理解Kafka:核心设计与实践原理》笔误及改进记录
  8. Java集合框架:LinkedList
  9. 视频压缩标准简史:从1929到2020
  10. 喜马拉雅贺雯迪:基于端到端TTS实现更具生动、富有情感的语音合成表现