2019独角兽企业重金招聘Python工程师标准>>>

Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。

当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

今天决定花几分钟时间写个小例子看下效果。以下实例演示了使用Exchange交换String数据,实际Exchange还可以交换对对象,比如交换List,HashMap,自定义的Model等。

源码如下:

package demo19;import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*** 使用Exchanger模拟买北京老冰棍的场景* @author mengfeiyang**/
public class ExchangeTest {public static void main(String[] args) {ExecutorService  service = Executors.newCachedThreadPool();Exchanger<String> changer = new Exchanger<String>();service.submit(new Runnable(){public void run(){try{String data1 = "北京老冰棍";System.out.println("线程 "+Thread.currentThread().getName()+" 正在把 "+data1+" 拿出来");String data2 = changer.exchange(data1);System.out.println("线程 "+Thread.currentThread().getName()+"用 "+data1+" 换来了"+data2);}catch(Exception e){e.printStackTrace();}finally{service.shutdown();System.out.println(Thread.currentThread().getName()+"交易完毕,撤!");}}});service.submit(new Runnable(){public void run(){try{String data1 = "100元";System.out.println("线程 "+Thread.currentThread().getName()+" 正在把钱 "+data1+" 拿出来");String data2 = changer.exchange(data1);System.out.println("线程 "+Thread.currentThread().getName()+"用 "+data1+"换来了"+data2);}catch(Exception e){e.printStackTrace();}finally{service.shutdown();System.out.println(Thread.currentThread().getName()+"交易完毕,撤!");}}});}
}

执行结果:

转载于:https://my.oschina.net/u/2391658/blog/710451

Java 线程数据交换控制器Exchange使用实例相关推荐

  1. 【Java】数据交换

    [Java]数据交换 需求 已知两个整数变量a = 10,b = 20,使用程序实现这两个变量的数据交换 最终输出a = 20,b = 10 代码 package com.cxl.demo28; // ...

  2. 基于Java的数据交换整合平台V2.0更新了

    数据交换ETL及可视化平台 平台定位 本平台是一个基于web的异构数据交换和数据可视化展示工具,支持常见的关系型数据库(MySQL,Oralce,SqlServer,PostgreSQL),适用于中小 ...

  3. 基于java的数据交换ETL工具及可视化平台源码

    平台定位 本平台是一个基于web的异构数据交换和数据可视化展示工具,支持常见的关系型数据库(MySQL,Oralce,SqlServer,PostgreSQL),适用于中小型企事业单位的内部信息化系统 ...

  4. java线程安全问题之静态变量、实例变量、局部变量

    转载 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定 ...

  5. java 线程安全问题之静态变量、实例变量、局部变量

    2019独角兽企业重金招聘Python工程师标准>>> java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编 ...

  6. Java线程池ThreadPoolExecutor参数讲解、实例助记 保证你过目不忘

    ThreadPoolExecutor构造器的参数说明 参数一:指定线程池的核心线程数量(核心线程,长久不死亡): corePoolSize 不能小于0 参数二:指定线程池可支持的最大线程数: maxi ...

  7. Java多线程研究(八)使用Exchange在多个线程间交换数据

    比如生活中两个人,一个人有零食,另一个人有钱,他们两个想等价交换,对好口号在某个地方相见,一个人先到了之后,必须等另一个人带着需要的东西来了之后,才能开始hi交换. 代码: import java.u ...

  8. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据

    1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...

  9. Java并发编程--6.Exchanger线程间交换数据

    在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中 在生产者-消费者情境模式中它包含了一个数缓冲区 ...

最新文章

  1. Linkify介绍 编辑textview超链接
  2. python测试用例图_pytest以函数形式的测试用例
  3. 去雾综述_【综述】图像去雾的前世今生
  4. 腾讯地图api如何根据地址获取经纬度
  5. html基础知识点列表
  6. Ehcache BigMemory: 摆脱GC困扰(转)
  7. product thumbnail区域未能显示的原因分析
  8. [剑指offer]面试题22:栈的压入、弹出序列
  9. linux nfsnobody用户,处理CentOS 5.5 x64 配置NFS服务过程中nfsnobody用户造成的问题
  10. 64 装饰器函数: 母版 csrf防御机制 cookie
  11. SAP License:ERP系统供应商管理都包含什么?
  12. 使用阿里云容器服务Jenkins 2.0实现持续集成之the tag you want篇(updated on 2017.09.06)...
  13. 【渝粤教育】广东开放大学 普通话训练 形成性考核 (48)
  14. 计算机模拟 matlab,MATLAB计算机模拟实例课件.ppt
  15. C++ 虚函数实现:虚函数表 虚表指针
  16. 湖南科技大学c语言上机题库,2018年湖南科技大学计算机科学与工程院824C语言程序设计与数据结构综合之C程序设计考研核心题库...
  17. sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, quitting sudo: 解决方法
  18. 编译原理:代码生成(pcode),C语言实现
  19. 金蝶K3 ACTIVEX部件不能创建对象 金蝶K3一直装载进不去
  20. 推荐一款高颜值第三方网易云客户端: YesPlayMusic

热门文章

  1. Boost:bind绑定全局占位符的测试程序
  2. Boost:bimap双图operator bracket的测试程序
  3. ITK:将内核应用于图像中的每个像素
  4. VTK:结构化网格之BlankPoint
  5. VTK:PolyData之MiscCellData
  6. VTK:图表之VertexSize
  7. VTK:图表之LabelVerticesAndEdges
  8. OpenCV背景减法Background Subtraction Methods
  9. OpenGL实现flocking (聚集)实例
  10. OpenGL 投光物Light casters