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