Java并发编程--6.Exchanger线程间交换数据
在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中
在生产者-消费者情境模式中它包含了一个数缓冲区,一个或者多个生产者,一个或者多个消费中
下面是生产者和消费者的示例:
/*** 生产者和消费者交换数据*/ 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线程间交换数据相关推荐
- Java并发工具Exchanger线程间交换数据
本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...
- java 多个线程共享数据_【java并发】多个线程间共享数据
先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...
- Java并发编程(04):线程间通信,等待/通知机制
本文源码:GitHub·点这里 || GitEE·点这里 一.概念简介 1.线程通信 在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题, ...
- JAVA 并发编程-多个线程之间共享数据(六)
多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时 ...
- java并发编程实践(2)线程安全性
[0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...
- Java并发编程—什么是线程?
原文作者:way_more 原文地址:Java 多线程常见基础面试题总结,面试必看! 目录 一.什么是线程和进程? 二.简要描述线程与进程的关系 三.FAQ 一.什么是线程和进程? 1.1. 何为进程 ...
- java并发编程第一课 线程的创建、停止和状态变更
开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...
- 线程间通信的几种方法_并发编程中的线程间通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 线程通信常用的方式有: wait/notify 等待 Volatile 内存共享 CountDownLatc ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
最新文章
- zrst指令是什么意思_PLC成批复位指令ZRST
- deactivate_sending在创建新的table entry时的作用
- boost stacktrace堆栈打印
- 假如 C++ 是一只箭,你会用它来射哪只雕?
- python读取csv文件
- 如何在java中把两个PDF拼接到一个
- jedisPool相关参数说明
- 老板喜欢的高绩效哪里来?
- fsolve:对非线性方程组求解
- Tether是操纵市场的幕后黑手吗?
- 面试数据分析师岗位要注意的几点
- 当你遇到问题时,如何去获取帮助
- 服务端与客户端加密解密思路
- 如何将项目使用docker分块部署
- IP首部校验和的计算
- <<前端进阶篇>> PDF 出炉了 — 「阿宝哥」,精心准备的 6 万多字 170 页的前端进阶资料
- plsql修改oracle系统时间,PLSQL更改日期输出格式
- hadoop组件概况
- 一周病毒播报 病毒窃取ADSL密码(转)
- Game AI SDK开源发布:基于图像的游戏场景自动化框架
热门文章
- 【Android】Mac Android adb 配置
- 分享 - Social.framework
- JS写的排序算法演示
- 安卓学习第36课——PopupWindow
- puppet完全攻略(一)puppet应用原理及安装部署
- Asp.Net异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值的解决方法...
- 转:VirtualBox虚拟机网络连接设置的四种方式
- 一个高(3D/2D)动态表现的酷站
- C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
- Selenium常用方法及函数