概述

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

  Exchanger 可被视为 SynchronousQueue 的双向形式。Exchanger在遗传算法和管道设计等应用中很有用。

  内存一致性:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。

使用

  提供的方法:

    // 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。public V exchange(V x) throws InterruptedException//增加超时机制,超过指定时间,抛TimeoutException异常public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

  使用示例:

    该类使用 Exchanger 在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给清空缓冲区的线程。

class FillAndEmpty {Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();DataBuffer initialEmptyBuffer = ... a made-up typeDataBuffer initialFullBuffer = ...//填充缓冲区线程class FillingLoop implements Runnable {public void run() {DataBuffer currentBuffer = initialEmptyBuffer;    //空的缓冲区try {while (currentBuffer != null) {addToBuffer(currentBuffer);    //填充数据//如果缓冲区被数据填满,执行exchange。等待清空缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。if (currentBuffer.isFull())currentBuffer = exchanger.exchange(currentBuffer);    }} catch (InterruptedException ex) { ... handle ... }}}//清空缓冲区线程class EmptyingLoop implements Runnable {public void run() {DataBuffer currentBuffer = initialFullBuffer;    //满的缓冲区try {while (currentBuffer != null) {takeFromBuffer(currentBuffer);    //清空缓冲区//如果缓冲区被清空,执行exchange。等待填充缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。if (currentBuffer.isEmpty())currentBuffer = exchanger.exchange(currentBuffer);}} catch (InterruptedException ex) { ... handle ...}}}void start() {new Thread(new FillingLoop()).start();new Thread(new EmptyingLoop()).start();}
}

Java并发编程之Exchanger相关推荐

  1. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  2. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  3. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  4. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  5. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  6. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  7. java并发编程之AbstractQueuedSynchronizer

    引言 AbstractQueuedSynchronizer,队列同步器,简称AQS,它是java并发用来构建锁或者其他同步组件的基础框架. 一般使用AQS的主要方式是继承,子类通过实现它提供的抽象方法 ...

  8. Java并发编程之synchronized关键字解析

    前言 公司加班太狠了,都没啥时间充电,这周终于结束了.这次整理了Java并发编程里面的synchronized关键字,又称为隐式锁,与JUC包中的Lock显示锁相对应:这个关键字从Java诞生开始就有 ...

  9. Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析

    自己一个人随便看看源码学习的心得,分享一下啦,不过我觉得还是建议去买本Java并发编程的书来看会比较好点,毕竟个人的理解有限嘛. 独占锁和共享锁 首先先引入这两个锁的概念: 独占锁即同一时刻只有一个线 ...

最新文章

  1. Halcon与QT的联合编程(1)
  2. 设置Button控件创建完毕时触发的事件.
  3. java plugin 安装_eclipse maven plugin 插件 安装 和 配置
  4. python 点的投影变换
  5. springboot不会运行gc_SpringBoot项目深度优化和Jvm调优
  6. php 根据坐标计算范围内,php计算经纬度是否在区域内
  7. dns的服务器地址是多少当前位置,dns的服务器地址设置为多少
  8. python图片识别验证码软件_python识别图片验证码
  9. 类的带参方法有哪几部分构成?
  10. arc073F Many Moves
  11. java 向下转型运行时错误_java多态和向下转型问题。
  12. Git-Git库管理
  13. 【Scratch案例实操】scratch大鱼吃小鱼(完整详案) scratch编程案例教学 scratch创意编程 少儿编程教案
  14. 【问题思考】二重积分积分限上的x和积分内部的x有什么区别?【几何直观】
  15. Java规则引擎easy rules
  16. Unity Editor Window Zooming
  17. 过滤器(1)_什么是过滤器?
  18. python 疯狂讲义 笔记(变量和基本类型)
  19. python用户输入字符串串从小到大排序_python字符串从小到大排序
  20. 离散数学:集合论的代数化样例

热门文章

  1. 0xC0000005: 读取位置 0x00000001 时发生访问冲突
  2. java基础练习题(for,switch,while,基本数据类型和引用数据类型的联系)
  3. Windows电脑垃圾清理 - 如何删除临时文件(Temp文件夹)
  4. 工控 组态王6.60 SP3软件7.5 SP4 授权软件狗 USB 硬件狗 分享 下载
  5. 定时任务 设置时间语法
  6. Android 解决 adapter.notifyDataSetChanged() 不起作用
  7. 和谁在一起的确很重要
  8. 计算机主板维修层次,计算机主板维修
  9. 在搭建分布式事务txlcn-tm服务端时遇到坑及解决方案
  10. Oracle 给其他用户授权表的权限