thread_Exchanger数据交换
Exchanger 是一个同步辅助类,用于两个并发线程之间在一个同步点进行数据交换。
允许两个线程在某一个点进行数据交换。
可以视作双向的同步队列;
可应用于基因算法、流水线设计等场景
Exchanger提供了 一个同步点 , 在这个同步点,两个线程可以交换数据 。每个线程通过exchange()方法的入口提供数据给另外的线程,并接收其它线程提供的数据,并返回。
public class Exchanger1Test {
// 场景描述:一对一的 生产者和消费者,生产者每次生产5个商品,然后消费者把空的商品容器和生产者交换。
// 生产者线程一定要先生产数据,再交换数据,消费者线程一定要先交换数据,再消费数据,否则会出现少消费数据的现象
// 允许原子性的交换两个(多个)对象,但同时只有一对才会成功
// exchange方法真的帮一对线程交换了数据;
// exchange方法真的会阻塞调用方线程直至另一方线程参与交易。
public static void main(String[] args) {
// Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。
// 两个线程必须使用同一个Exchanger对象,且只能是两个线程间的数据交换
// 当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行
Exchanger<ArrayList<String>> exchanger = new Exchanger<ArrayList<String>>();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new Producer(exchanger));
exec.execute(new Consumer(exchanger));
exec.shutdown();
try {
exec.awaitTermination(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// log.error(e, e);
}
}
}
// 生产者
class Producer implements Runnable {
private ArrayList<String> goods = new ArrayList<String>(); // 商品容器
private Exchanger<ArrayList<String>> exchanger = new Exchanger<ArrayList<String>>();
//控制交易双方线程的退出
private static AtomicBoolean isDone = new AtomicBoolean(true);
public Producer(Exchanger<ArrayList<String>> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
while (!Thread.interrupted() && isDone.get()) {//
for (int i = 0; i < 3; i++) { // 生产3次
System.out.println("------------------------生产者生产第 " + i + "次");
for (int j = 0; j < 3; j++) { // 每次生产3个商品
String e = (long) (Math.random() * 1000) + "";
goods.add(e);
System.out.println("生产了商品:" + e);
}
try {
// 生产者线程一定要先生产数据,再交换数据,消费者线程一定要先交换数据,再消费数据
// exchanger.exchange(v)的时候,当前线程会被阻塞,直到另一个线程执行该方法,同时完成数据的交换
goods = exchanger.exchange(goods); // 交换数据
System.out.println("生产者:数据交换完毕:获得交换的商品容器大小:" + goods.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
// 消费者
class Consumer implements Runnable {
private ArrayList<String> goods = new ArrayList<String>(); // 商品容器
private Exchanger<ArrayList<String>> exchanger = new Exchanger<ArrayList<String>>();
private static AtomicBoolean isDone = new AtomicBoolean(true);
public Consumer(Exchanger<ArrayList<String>> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
while (!Thread.interrupted() && isDone.get()) {//&& !isDone
for (int i = 0; i < 3; i++) { // 消费3次
try {
// 生产者线程一定要先生产数据,再交换数据,消费者线程一定要先交换数据,再消费数据
// exchanger.exchange(v)的时候,当前线程会被阻塞,直到另一个线程执行该方法,同时完成数据的交换
goods = exchanger.exchange(goods); // 交换数据
System.out.println("消费者:数据交换完毕:获得交换的商品容器大小:" + goods.size());
// 消费商品
Iterator<String> it = goods.iterator();
if (goods.size() > 0) {
System.out.println("*********************消费者消费第 " + i + "次");
while (it.hasNext()) {
String next = it.next();
System.out.println("消费了商品:" + next);
it.remove(); // 移除消费了的商品
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
thread_Exchanger数据交换的更多相关文章
- Android:Activity+Fragment及它们之间的数据交换.
Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...
- Atitit.常见软件 数据 交换格式 标准
Atitit.常见软件 数据 交换格式 标准 1. 常见的数据格式txt ,doc ,pic,music ,vodio1 2. 通用格式json yaml phpstr1 3. 专用格式1 4. 用户 ...
- Js中JSON数据交换使用总结
Json格式简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是JavaScript原 ...
- Java--Exchanger用于进行线程间的数据交换
package com; import java.util.concurrent.Exchanger; /** * Created by yangyu on 16/11/28. */ /** * Ex ...
- 【AS3】Flash与后台数据交换四种方法整理
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...
- JQuery + XML作为前后台数据交换格式实践
JQuery + xml作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ xml作为一种 ...
- JQuery + JSON作为前后台数据交换格式实践
JQuery + JSON作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ JSON作为 ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
- java5 Exchanger数据交换
Java并发API提供了一种允许2个并发任务间相互交换数据的同步应用.更具体的说,Exchanger类允许在2个线程间定义同步点,当2个线程到达这个点,他们相互交换数据类型,使用第一个线程的数据类型变 ...
随机推荐
- 在DataTable中执行DataTable.Select("条件")返回DataTable;
转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...
- PropertyPlaceholderConfigurer的用法:
用法1: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- android OOM分析工具LeakCanary
http://my.oschina.net/u/255456/blog/523659?fromerr=oGosxKBf LeakCanary 只是探测到可能出现内存泄露,然后dump 一个java h ...
- Android杂谈--HTC等手机接收不到UDP广播报文的解决方案
最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...
- 云计算的三层SPI模型
(转自:http://hi.baidu.com/fengjun8216/item/b15bbef4dcf74049922af27b) 一般而言,云计算架构可以用三层SPI模型来表述. 一.基础设施即服 ...
- 批处理Ping服务器
for /f "tokens=2,*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersio ...
- 我的web框架
我的web框架 ========================================================== 前端:css(bootstrap,自己的代码片段),js(jque ...
- Windows 8.1 & Windows 10 取消 Windows Update 自动更新硬件驱动
最新文章:Virson's Blog 1.打开控制面板,在搜索框中搜索“设备”一次,检索出相关的设备设置功能,如下图: 2.在检索出的结果中点击“更改设备安装设置”,会弹出设备驱动的更新方式,按照如下 ...
- Javascript类继承-机制-代码Demo【原创】
最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
- ALTER SEQUENCE 修改序列解决唯一约束冲突 unique constraint violated
背景 自增序列会遇到也会遇到唯一约束冲突吗?是的,最常见的情况就是数据迁移之后,导致数据最大值超过序列值. 软件开发中不遇到些出乎意料的问题,总感觉不太够劲. 修改序列(ALTER SEQUENCE) ...