Exchanger并发辅助类,允许在并发任务之间交换数据。具体来说Exchanger类在两个线程之间定义同步点。当两个线程到达同步点时,它们交换数据结构。需要注意的是Exchanger类只能同步两个线程。

  内存一致性效果:对于通过Exchanger成功交换对象的每对线程,每个线程中在exchanger()之前的操作 happen-before从另一线程中相应的exchanger()返回的后续操作。

下面用一对一的生产者-消费者例子进行说明。

  生产者代码如下:

public class Producer implements Runnable {
private List<String> buffer;
private Exchanger<List<String>> exchanger;
public Producer(List<String> buffer, Exchanger<List<String>> exchanger) {
this.buffer = buffer;
this.exchanger = exchanger;
}
@Override
public void run() {
int cycle=1;
for (int i=0; i<10; i++) {
System.out.println("Producer:Cycle "+cycle);
for (int j = 1; j <=10; j++) {
String msg="Event "+(i*10+j);
System.out.println("Producer: "+msg);
buffer.add(msg);
}
try {
buffer=exchanger.exchange(buffer);//和消费者交换数据结构
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Producer size: "+buffer.size());
cycle++;
}
} }

  消费者代码:

public class Consumer implements Runnable {
private List<String> buffer;
private Exchanger<List<String>> exchanger;
public Consumer(List<String> buffer, Exchanger<List<String>> exchanger) {
this.buffer = buffer;
this.exchanger = exchanger;
}
@Override
public void run() {
int cycle=1;
for (int i=0; i<=9; i++) {
System.out.println("Consumer: Cycle "+cycle);
try {
buffer=exchanger.exchange(buffer);//he生产者交换数据结构
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Consumer size: "+buffer.size());
for (int j = 1; j <=10; j++) {
String msg=buffer.get(0);
System.out.println("Consumer: "+msg);
buffer.remove(0);
}
cycle++;
}
}
}

  运行:

public class Core {
public static void main(String[] args) {
List<String> buffer1=new ArrayList<String>();
List<String> buffer2=new ArrayList<String>();
Exchanger<List<String>> exchanger=new Exchanger<List<String>>();
Producer producer=new Producer(buffer1, exchanger);
Consumer consumer=new Consumer(buffer2, exchanger);
Thread thread1=new Thread(producer);
Thread thread2=new Thread(consumer);
thread1.start();
thread2.start();
}
}

最新文章

  1. 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。
  2. NodeJS系列~第四个小例子,NodeJs处理Get请求和Post请求
  3. JavaScript的attribute和property辨析
  4. PL/SQL连接Oracle客户端步骤
  5. XMPP框架下微信项目总结(5)花名册获取(好友列表)
  6. GO RPC
  7. Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)
  8. SDUT 3571 Password 暴力搜索
  9. mysql CASE WHEN的基础和多种用法
  10. PHP ‘scan’函数拒绝服务漏洞
  11. MSSQLSERVER数据库- 解决不允许保存更改表结构
  12. Java反射 - 1(得到类对象的几种方法,调用方法,得到包下的所有类)
  13. C++ template学习二 类模板定义及实例化
  14. hihocoder 1050 树中的最长路(动态规划,dfs搜索)
  15. 2017-06-24(chgrp umask alias unalias)
  16. 【一天一道LeetCode】#47. Permutations II
  17. python &amp; MySQLdb(one)
  18. Warning: Failed to halt at after bootloader, forced stop at
  19. 【阿里巴巴】CBU技术部招聘
  20. HDU 4280 Island Transport(网络流,最大流)

热门文章

  1. [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
  2. [UWP]涨姿势UWP源码——适配电脑和手机
  3. POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别
  4. 老李分享:接电话扩展之uiautomator 2
  5. Java面试题:Servlet是线程安全的吗?
  6. Java设计模式面试题 01 - 六大原则
  7. es6基础系列一:let和const
  8. react中,constructor和getInitialState的区别
  9. 学习Sass之安装篇
  10. HTTP协议介绍