资讯专栏INFORMATION COLUMN

Java Exchanger交换线程

刘德刚 / 650人阅读

摘要:使用一个交换两个线程的数据,交换期间该会被锁住,一般用于通信领域。当双方完成交换后,交换的就为的返回值。必须指定返回值的,否则该生产者生产的将不会与消费者的空进行交换。

Exchanger 使用一个pipeline交换两个线程的数据,交换期间该Slot会被锁住,一般用于通信领域。
该类提供两个方法

  

// k为交换对象
exchange(V k)
//指定超时时间
exchange(V k, int timeOut, TimeUnit unit)

使用时,除了参数k必须外,返回值也必须使用k接收,否则会出现接收不到的数据的情况,如:

//生产者线程
ProductBean bean= new ProductBean()
// 设置Product属性
bean.set()....
// 生产完成,开始与消费者交换
bean = Exchanger实例名.exchange(bean)

// 消费者线程
ProductBean bean = new ProductBean();
bean = Exchanger实例名.exchange(bean)

生产者将生产的ProductBean放入pipeline中,等待交换。消费者将空Bean放入pipeline等待交换。不论是生产者还是消费者都必须接收exchange方法的返回值,即将exchange的bean赋值给bean。当双方完成交换后,交换的bean就为exchange的返回值。
必须指定返回值的bean,否则该生产者生产的bean将不会与消费者的空bean进行交换。

关于该类的最详细解释当属于源码中的关于算法的注释,这一部分并没有显示在doc文档中,必须看源码才能看见。该注释中说到

  

The basic idea is to maintain a "slot", which is a reference to a Node containing both an Item to offer and a "hole" waiting to get filled in.

  

最基本的思想是维护一个Slot(槽),该Slot指向一个包含有一个用于交换的Item和一个等待填充的hole的Node。

该hole其实是用于接收交换的Node.

该算法解释分为五部分,

Waiting

Sizing

Hashing

Probing

Padding

此外,该类的作者Doug Lea,还附上了一篇关于此思想的论文A Scalable Elimination-based Exchange Channel,可免费获得。

有同学做了如下图,比较浅显易懂。

关于此图的解释请移步至深入浅出 Java Concurrency (26): 并发容器 part 11 Exchanger

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64115.html

相关文章

  • java并发编程学习之Exchanger

    摘要:作用用来交换两个线程的数据。示例运行结果如下首先,会经过三秒后,才输出结果,说明两个线程没交换之前是阻塞的。 作用 用来交换两个线程的数据。 示例 public class ExchangerDemo { static Exchanger exchanger = new Exchanger(); static class Thread1 extends Thread ...

    lingdududu 评论0 收藏0
  • (十二)java线程Exchanger

    摘要:本人邮箱欢迎转载转载请注明网址代码已经全部托管有需要的同学自行下载引言今天我们讲最后一个同步工具类这个比较简单就是让两个线程交换数据理论只有两个方法而已而且两个还是一样的只是参数不通而已跟另外一个线程交换数据如果另外一个线程的数据准备好那么 本人邮箱: 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    Flands 评论0 收藏0
  • Java线程进阶(一)—— J.U.C并发包概述

    摘要:整个包,按照功能可以大致划分如下锁框架原子类框架同步器框架集合框架执行器框架本系列将按上述顺序分析,分析所基于的源码为。后,根据一系列常见的多线程设计模式,设计了并发包,其中包下提供了一系列基础的锁工具,用以对等进行补充增强。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首发于一世流云专栏:https...

    anonymoussf 评论0 收藏0
  • Java线程编程之同步器

    摘要:倒计时锁,线程中调用使进程进入阻塞状态,当达成指定次数后通过继续执行每个线程中剩余的内容。实现分阶段的的功能测试代码拿客网站群三产创建于年月日。 同步器 为每种特定的同步问题提供了解决方案 Semaphore Semaphore【信号标;旗语】,通过计数器控制对共享资源的访问。 测试类: package concurrent; import concurrent.th...

    liangdas 评论0 收藏0
  • Java并发

    摘要:对象改变条件对象当前线程要等待线程终止之后才能从返回。如果线程在上的操作中被中断,通道会被关闭,线程的中断状态会被设置,并得到一个。清除线程的中断状态。非公平性锁虽然可能造成饥饿,但极少的线程切换,保证其更大的吞吐量。 声明:Java并发的内容是自己阅读《Java并发编程实战》和《Java并发编程的艺术》整理来的。 showImg(https://segmentfault.com/im...

    SKYZACK 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<