在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中

在生产者-消费者情境模式中它包含了一个数缓冲区,一个或者多个生产者,一个或者多个消费中

下面是生产者和消费者的示例:

/*** 生产者和消费者交换数据*/
public class MyExchanger {public static void main(String[] args) {Exchanger<List<String>> exchanger = new Exchanger<List<String>>();Producer1 producer = new Producer1(new ArrayList<String>(), exchanger);Consumer1 consumer = new Consumer1(new ArrayList<String>(), exchanger);new Thread(producer).start();new Thread(consumer).start();}
}/** 生产者线程*/class Producer1 implements Runnable{/*** 存储交换的数据*/private List<String> buffer;/*** 和消费者要交换的对象*/private final Exchanger<List<String>> exchanger;Producer1(List<String> buffer,Exchanger<List<String>> exchanger){this.buffer = buffer;this.exchanger = exchanger;}@Overridepublic void run() {for(int i = 0 ; i < 2 ; i++){String message = "" + i ;System.out.println("Produce的数据 : " + message);buffer.add(message);//调用exchange()与消费者进行数据交换try {buffer = exchanger.exchange(buffer);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Produce收到来自Consumer的数据的长度 : " + buffer.size());}
}/** 消费者线程*/
class Consumer1 implements Runnable{private List<String> buffer;private final Exchanger<List<String>> exchanger;public Consumer1(List<String> buffer,Exchanger<List<String>> exchanger){this.buffer = buffer;this.exchanger = exchanger;}@Overridepublic void run() {for(int i = 0 ; i < 2 ; i++){//调用exchange()与消费者进行数据交换try {buffer = exchanger.exchange(buffer);} catch (InterruptedException e) {e.printStackTrace();}for(int j = 0 ; j < buffer.size() ; j++){System.out.println("Consumer收到来自Produce的数据 : " + buffer.get(0));buffer.remove(0);}}System.out.println("Consumer清空数据");}}

控制台输出:

Produce的数据 : 0
Consumer收到来自Produce的数据 : 0
Produce的数据 : 1
Produce收到来自Consumer的数据的长度 : 0
Consumer收到来自Produce的数据 : 1
Consumer清空数据

在Exchanger中,如果一个线程已经到达了exchanger节点时,对于它的伙伴节点的情况有三种:

1、如果它的伙伴节点在该线程到达之间已经调用了exchanger方法,则它会唤醒它的伙伴然后进行数据交换,得到各自数据返回。

2、如果它的伙伴节点还没有到达交换点,则该线程将会被挂起,等待它的伙伴节点到达被唤醒,完成数据交换。

3、如果当前线程被中断了则抛出异常,或者等待超时了,则抛出超时异常

转载于:https://www.cnblogs.com/liuconglin/p/6710688.html

Java并发编程--6.Exchanger线程间交换数据相关推荐

  1. Java并发工具Exchanger线程间交换数据

    本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...

  2. java 多个线程共享数据_【java并发】多个线程间共享数据

    先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...

  3. Java并发编程(04):线程间通信,等待/通知机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.概念简介 1.线程通信 在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题, ...

  4. JAVA 并发编程-多个线程之间共享数据(六)

    多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时 ...

  5. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  6. Java并发编程—什么是线程?

    原文作者:way_more 原文地址:Java 多线程常见基础面试题总结,面试必看! 目录 一.什么是线程和进程? 二.简要描述线程与进程的关系 三.FAQ 一.什么是线程和进程? 1.1. 何为进程 ...

  7. java并发编程第一课 线程的创建、停止和状态变更

    开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...

  8. 线程间通信的几种方法_并发编程中的线程间通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 线程通信常用的方式有: wait/notify 等待 Volatile 内存共享 CountDownLatc ...

  9. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

最新文章

  1. zrst指令是什么意思_PLC成批复位指令ZRST
  2. deactivate_sending在创建新的table entry时的作用
  3. boost stacktrace堆栈打印
  4. 假如 C++ 是一只箭,你会用它来射哪只雕?
  5. python读取csv文件
  6. 如何在java中把两个PDF拼接到一个
  7. jedisPool相关参数说明
  8. 老板喜欢的高绩效哪里来?
  9. fsolve:对非线性方程组求解
  10. Tether是操纵市场的幕后黑手吗?
  11. 面试数据分析师岗位要注意的几点
  12. 当你遇到问题时,如何去获取帮助
  13. 服务端与客户端加密解密思路
  14. 如何将项目使用docker分块部署
  15. IP首部校验和的计算
  16. <<前端进阶篇>> PDF 出炉了 — 「阿宝哥」,精心准备的 6 万多字 170 页的前端进阶资料
  17. plsql修改oracle系统时间,PLSQL更改日期输出格式
  18. hadoop组件概况
  19. 一周病毒播报 病毒窃取ADSL密码(转)
  20. Game AI SDK开源发布:基于图像的游戏场景自动化框架

热门文章

  1. 【Android】Mac Android adb 配置
  2. 分享 - Social.framework
  3. JS写的排序算法演示
  4. 安卓学习第36课——PopupWindow
  5. puppet完全攻略(一)puppet应用原理及安装部署
  6. Asp.Net异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值的解决方法...
  7. 转:VirtualBox虚拟机网络连接设置的四种方式
  8. 一个高(3D/2D)动态表现的酷站
  9. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
  10. Selenium常用方法及函数