Java Exchanger交换线程

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java Exchanger交换线程脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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 Exchanger交换线程


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

脚本宝典总结

以上是脚本宝典为你收集整理的Java Exchanger交换线程全部内容,希望文章能够帮你解决Java Exchanger交换线程所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。