博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发 Exchanger
阅读量:6137 次
发布时间:2019-06-21

本文共 2529 字,大约阅读时间需要 8 分钟。

  hot3.png

Exchanger是一个线程间交换数据的工具类。

Exchanger从字面上可以理解为交换者,是一个可以用于线程间协作的工具类。主要用于线程间的数据交换。Exchanger提供一个同步点,在这个同步点上,两个线程可以交换彼此的数据。这两个线程可以通过exchange方法交换数据,当然存在线程执行不同步的情况,如果第一个线程先到达同步点,那么在第二个线程到达同步点之前,第一个线程会阻塞等待,直到两个线程都到达同步点,两个线程就可以使用exchange方法交换彼此的数据。

Exchanger可以用于遗传算法得到不同的交配结果。也可以用于校验数据,比如有两个会计师进行账目的对账工作,为了防止出错,系统可以将这两个会计师对账的结果进行比对,从而检查结果是否一致。下面的代码演示了这个场景:

package com.rhwayfun.patchwork.concurrency.r0407;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by rhwayfun on 16-4-7. */public class ExchangerDemo {    /**     * 交换器     */    private static final Exchanger
exchanger = new Exchanger<>(); /** * 线程池 */ private static ExecutorService threadPool = Executors.newFixedThreadPool(2); /** * */ private static final DateFormat format = new SimpleDateFormat("HH:mm:ss"); /** * 主线程 * @param args */ public static void main(String[] args){ //第一个会计师进行对账 threadPool.execute(new Runnable() { @Override public void run() { try { String resA = "A's result"; //调用exchange方法表示当前线程已经到达了同步点 exchanger.exchange(resA); System.out.println(Thread.currentThread().getName() + " arrives at syncPoint at " + format.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }); //第二个会计师进行对账 threadPool.execute(new Runnable() { @Override public void run() { try { String resB = "B's result"; String resF = exchanger.exchange(resB); System.out.println(Thread.currentThread().getName() + " arrives at syncPoint at " + format.format(new Date())); System.out.println("Is the data consistent?" + resF.equals(resB) + ". A:" + resF + ", B:" + resB + " at " + format.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }); //关闭线程池 threadPool.shutdown(); }}

代码执行的结果如下:

这里写图片描述

程序中如果有一个线程没有到达同步点,则会一直等待,如果不希望一直等待可以使用指定等待时间的exchange(V x,long timeout,TimeUnit unit)指定最长的等待时间。

转载于:https://my.oschina.net/oosc/blog/1623269

你可能感兴趣的文章
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
dubbo
查看>>
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>