并发工具类(四)线程间的交换数据 Exchanger

前言

  JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch、CyclicBarrier、Semphore、Exchanger、Phaser;
  CountDownLatch、CyclicBarrier、Semphore、Phaser 这四个工具类提供一种并发流程的控制手段;而Exchanger工具类则提供了在线程之间交换数据的一种手段。

简介

   Exchanger的功能是使2个线程之间交换数据(有不少文章的说法是“传输数据”,应该叫“交换数据”更合适,因为这是两个线程都要向对方传送数据,同时也获取对方的传送过来的数据,是

双向模式
,并不是一个线程向另一个线程传输数据)。它比生产者/消费者模式使用的wait/notify要更加方便。
  Exchanger 提供一个同步点,在这个同步点处,两个线程可以交换彼此数据。即一个线程调用了exchange( )方法交换数据,到达了同步点,然后就会一直阻塞等待另一个线程调用exchange( )方法来交换数据。所以,要注意
exchange( )方法是有阻塞的特性。

Exchanger 可能在应用程序(比如
遗传算法和管道设计
)中很有用。

方法摘要

public V exchange(V x) throws InterruptedException
等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对

@ Example1 用法示例

以下是重点介绍的一个类,该类使用 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);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);if (currentBuffer.isEmpty())currentBuffer = exchanger.exchange(currentBuffer);}} catch (InterruptedException ex) { ... handle ...}}}void start() {new Thread(new FillingLoop()).start();new Thread(new EmptyingLoop()).start();}}
复制代码

@ Example2 应用场景示例

Exchanger可以用于

遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。


Exchanger也可以用于

校对工作。

比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致。代码如下:

private static final Exchanger<String> exgr = new Exchanger<String>();
private static ExecutorService threadPool = Executors.newFixedThreadPool(2);public static void main(String[] args) {threadPool.execute(new Runnable() {@Overridepublic void run() {try {String A = "银行流水A";// A录入银行流水数据exgr.exchange(A);//同步点,交换数据} catch (InterruptedException e) {}}});threadPool.execute(new Runnable() {@Overridepublic void run() {try {String B = "银行流水B";// B录入银行流水数据String A = exgr.exchange("B");//同步点,交换数据System.out.println("A和B数据是否一致:" + A.equals(B) + "\nA录入的是:"+ A + "\nB录入的是:" + B);} catch (InterruptedException e) {}}});threadPool.shutdown();
}
复制代码

运行结果:

A和B数据是否一致:false
A录入的是:银行流水A
B录入的是:银行流水B
复制代码

文章源地址:https://www.cnblogs.com/jinggod/p/8494384.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「前端组件化」该怎么理解?

大家好&#xff0c;我是若川。今天分享一篇关于「前端组件化」的好文。欢迎点击下方卡片关注我。以下是正文~这里我们一起来学习前端组件化的知识&#xff0c;而组件化在前端架构里面是最重要的一个部分。讲到前端架构&#xff0c;其实前端架构中最热门的就有两个话题&#xff…

大屏设计的视觉统一_视觉设计中的统一

大屏设计的视觉统一视觉设计的统一性是什么&#xff1f; (What is unity in visual design?) The concept of unity in visual design means a group of elements working together to create a greater whole. It means, as the clich goes: A whole that is greater than th…

l2范数求导_机器学习中的范数规则化之(一)L0、L1与L2范数

source: https://blog.csdn.net/zouxy09/article/details/24971995zouxy09qq.comhttp://blog.csdn.net/zouxy09今天我们聊聊机器学习中出现的非常频繁的问题&#xff1a;过拟合与规则化。我们先简单的来理解下常用的L0、L1、L2和核范数规则化。最后聊下规则化项参数的选择问题。…

9.struts1.x中tiles框架的使用

在页面直接使用titles标签先引入标签&#xff1a;<%taglib uri"http://struts.apache.org/tags-tiles" prefix"tiles" %> 将模板页面要代替的内容用标签占位&#xff1a;<tiles:insert attribute"content"></tiles:insert> 在…

Debian 9.6.0 + OpenMediaVault 4.x : U盘作系统盘时遇到的问题

前几天在虚拟机试验的时候还说装到实机一般也没什么问题&#xff0c;然后突然间想试试如果把 Debian9OMV 都放到U盘里会怎么样。于是就折腾&#xff08;然后懵逼&#xff09; 先总结一下 写入openmediavault官方的iso到U盘使用UNetbootin写入Debian9的iso使用UltraISO的默认设置…

新浪微博、腾讯微博、QQ空间、人人网、豆瓣 一键分享API

转载链接&#xff1a;http://www.bluesdream.com/blog/sina-tencent-renren-douban-share-a-key-api.html 新浪微博&#xff1a; http://service.weibo.com/share/share.php?url count表示是否显示当前页面被分享数量(1显示)(可选&#xff0c;允许为空) &url将页面地址转…

跟着官方文档能学懂React Hooks就怪了

大家好&#xff0c;我是若川。今天分享一篇关于「React Hooks」的好文。欢迎点击下方卡片关注我。以下是正文~回想下你入门Hooks的过程&#xff0c;是不是经历过&#xff1a;类比ClassComponent的生命周期&#xff0c;学习Hooks的执行时机慢慢熟练以后&#xff0c;发现Hooks的执…

origin图上显示数据标签_Origin(Pro):寒假都结束了,这个图还是不会画?【数据绘图】...

寒假前给大家分享了一个图&#xff0c;大家要的教程来了。【数据绘图】好图分享&#xff1a;寒假&#xff1f;不存在的&#xff01;​mp.weixin.qq.com绘图思路&#xff1a;左侧起止时间&#xff1a;散点图&#xff0c;交换XY坐标轴&#xff1b;中间的连线为Drop Lines&#xf…

可以激发设计灵感的音乐_建立灵感库以激发您的创造力

可以激发设计灵感的音乐I often find a lot of inspiration from work I see while scrolling social media. Saving art or images that inspire you allows you to build a library of resources to draw from whenever you’re working on a project.在滚动社交媒体时&#…

CentOS服务器上部署 oracle10gr2

1、下载Centos系统 Linux 镜像文件。 推荐使用 CentOS5.4&#xff0c;下载地址&#xff1a;http://isoredirect.centos.org/centos/5/isos/i386/ 。这个是 32 位的 Linux 系统镜像安装文件&#xff0c;进入下载页面后&#xff0c;如果是 DVD 光盘安装&#xff0c;可以仅…

回顾:中网通讯网络公司CEO罗与曾作客新浪嘉宾聊天室

转载链接&#xff1a;http://tech.sina.com.cn/it/w/2001-11-09/91253.shtml 回顾&#xff1a;中网通讯网络公司CEO罗与曾作客新浪嘉宾聊天室 大家好&#xff01;   主持人 &#xff1a;各位网友&#xff0c;下午好&#xff0c;今天我们请到了中网通讯网络公司首席执行官罗…

form——验证器Validators

form表单最大的作用就是验证功能了&#xff0c;通过cleaned_data清洗&#xff0c;我们可以获取传来的值&#xff0c;通过参数、验证器、自定义验证方法&#xff0c;我们可以做到很多的验证。 验证器可用于在不同类型的字段之间重用验证逻辑。validators有自带的验证器&#xff…

若川知乎问答:做前端感觉很吃力怎么办?

前些日&#xff0c;我发了一篇推文《做前端感到越来越吃力了&#xff01;怎么办&#xff1f;》&#xff0c;虽然是推广&#xff0c;但阅读量却很高&#xff0c;推广标题我们大概率不能改&#xff0c;感觉骗了大家&#xff0c;掉粉挺多人。写稿的人可能就是看到了知乎这个问答。…

惠新宸php教程_惠新宸:首位国人加入PHP语言官方开发组

PHP开发组终于有了国人参与。最近&#xff0c; Laruence(真名惠新宸)加入了PHP语言官方开发组。 做PHP的同学一定很熟悉他了&#xff0c;他的博客风雪之隅(https://www.laruence.com/)发表了很多PHP源代码分析和扩展开发相关的文章。他使用PHP扩展开发的PHP框架Yaf&#xff0c;…

d3 制作条形图_停止制作常见的坏条形图的5个简单技巧

d3 制作条形图Bar charts were probably the first type of chart you were ever introduced to in first grade. Their simplicity makes them a standard in visualizing data, but it is its accessibility that leads visualizers to often be careless with bar charts.乙…

SVN之使用原则

以下是我起草的部门SVN规范里原则的一部分。文件提交时要求必须提交注释&#xff0c;注明相关修改信息&#xff0c;例如bug号、任务描述等。具体内容可采用约定或者设置的形式。你所提交的改变将体现给其他开发者&#xff0c;要明白提交的后果&#xff0c;提交之前要慎重。代码…

图解 React-router 源码

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12今天分享一篇react-router源码文章&#xff0c;深入理解路由的本质。微信预计阅读只需8分钟。点击下方卡片关注我&#xff0c;或者查看源码系列文章。阅读源码小 tips&#xff1a;从整体到细节&#xff0c;刚开始不要太拘泥…

青海西宁市大通县非洲猪瘟疫区解除封锁

中新网1月23日电 据农业农村部网站消息&#xff0c;农业农村部接到青海省农业农村厅报告&#xff0c;经评估验收合格&#xff0c;青海省西宁市大通县非洲猪瘟疫区解除封锁。 大通县非洲猪瘟疫情发生后&#xff0c;当地按照非洲猪瘟疫情应急预案和非洲猪瘟防治技术规范要求&…

回顾:中网饱经沧桑劫后余生 万平国回首艰辛历程

转载链接&#xff1a;http://tech.sina.com.cn/i/c/75586.shtml 回顾&#xff1a;中网饱经沧桑劫后余生 万平国回首艰辛历程 http://www.sina.com.cn 2001年07月12日 13:25 财经时报   “最早的聊天室是我们做的、最早的检索也是中网公司的、中网公司也是最早做电子商务的数…

android 辅助功能_辅助功能简介

android 辅助功能Accessibility may be more than a moral imperative to ensure products are inclusive of more people who already experience barriers in daily life — it has a very practical outcome, benefiting everyone including the person with the disability…