Exchanger用法详解

Exchanger适用场景

Exchanger用于线程之间交换数据,其使用代码很简单,主要是使用是一个exchange()方法。

一个简单的例子如下

Exchanger<String> exchanger = new Exchanger<>();new Thread(()->{System.out.println(" thread 1 ");try {String exchange = exchanger.exchange(" thread 1 send data ");System.out.println(" thread 1 revicer data : " + exchange);} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{System.out.println(" thread 2 ");try {String exchange = exchanger.exchange(" thread 2 send data ");System.out.println(" thread 2 revicer data : " + exchange);} catch (InterruptedException e) {e.printStackTrace();}}).start();}

2个线程之间彼此交换数据

如果我们一个线程执行超时,另一个线程是否会等待?

Exchanger<String> exchanger = new Exchanger<>();new Thread(()->{System.out.println(" thread 1 ");try {String exchange = exchanger.exchange(" thread 1 send data ",2, TimeUnit.SECONDS);System.out.println(" thread 1 revicer data : " + exchange);} catch (InterruptedException | TimeoutException e) {e.printStackTrace();}}).start();new Thread(()->{System.out.println(" thread 2 ");try {TimeUnit.SECONDS.sleep(5);String exchange = exchanger.exchange(" thread 2 send data ");System.out.println(" thread 2 revicer data : " + exchange);} catch (InterruptedException e) {e.printStackTrace();}}).start();

我们可以看到是等待的,会一直阻塞在哪儿。


使用时尽量使用超时时间的那个先换方法 public V exchange(V x, long timeout, TimeUnit unit)

那如果我们选择交换一个对象呢?该对象是否是安全的?

 Object object =  new Object();Exchanger<Object> exchanger = new Exchanger<>();new Thread(()->{System.out.println(" thread 1 ");try {Object exchange = exchanger.exchange(object);System.out.println(" thread 1 revicer data : " + exchange);} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{System.out.println(" thread 2 ");try {Object exchange = exchanger.exchange(object);System.out.println(" thread 2 revicer data : " + exchange);} catch (InterruptedException e) {e.printStackTrace();}}).start();

可以看到对象是一样的,交换对象时候需要注意对象的安全。多个线程下需要注意线程同步问题。

Exchanger用法详解相关推荐

  1. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  2. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  3. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  4. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  5. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  6. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  7. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  8. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  9. WinDbg用法详解

    WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111

最新文章

  1. Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
  2. 凯利公式判定持仓比例
  3. Way to configure the logon navigaion layouts via Business Roles in CRM
  4. CodeForces - 444C DZY Loves Colors(线段树+剪枝)
  5. HDU - 5371 Hotaru's problem(马拉车+暴力)
  6. .NET Core 使用 K8S ConfigMap的正确姿势
  7. 腾讯游戏与NVIDIA合作发布START云游戏服务
  8. 拿高薪的web前端都是怎么学的?
  9. docker安装chirpstack_用docker-compose快速部署ChirpStack
  10. 逻辑SQL Server数据复制101
  11. c#通过OleDb连接sybase 15.5
  12. 微信硬件平台对接--蓝牙
  13. 介绍H桥电机驱动电路
  14. 中兴捧月算法挑战赛-RAW夜景图像去噪总结
  15. 不存在R上的连续函数f,它在无理数集R\Q上是一一映射,而在有理数集Q上不是一一映 射。
  16. 基于JCA安全体系的封装
  17. Typora 收费?试试这款开源 Markdown 神器!好用还美观
  18. php 模板 下载xml,模板用xml的思路_PHP
  19. FTT暴雷加密熊市雪上加霜?如何对抗系统风险
  20. 数据采集中的 全量采集,增量采集,差异采集

热门文章

  1. 【C语言】-杨辉三角
  2. iOS 证书申请和使用详解
  3. 【测试沉思录】1. 如何保障需求质量(上):你应该知道的
  4. matlab 对矩阵按照某一列排序
  5. 服务器组装维护培训,通用服务器管理维护方案培训.ppt
  6. grunt uglify
  7. jquery 点击按钮复制文本内容(亲测有效)
  8. 幸福消费成酒店投资趋势红利,荟语酒店凭何打造品牌核心优势
  9. 计算机网络考研复试问答整理
  10. 欧蓝德 (660) -(警车内被乔丹体育)_乔丹能否在现代篮球中取得一样的成功?五大理由证明他可以!...