并发(六):用Exchanger实现数据交换
来源:互联网 发布:vgg19网络结构图 编辑:程序博客网 时间:2024/05/21 17:26
在多线程程序的设计中,最难处理就是各线程之间的耦合关系,所以JDK提供了很多用于解耦的类,例如BlockingQueue、BlockingDeque等,这些类的特点是既可以适用于消费者/生产者模式,还可以适用于消费者与生产者混合模式。
今天介绍的Exchanger除了在数据交换方面表现得非常优秀之外,还能协调线程的执行进度,而且是多个线程(并没有一对一之间的关系)之间的进度,所有特别适用于分发任务,下面给出一个最简单的代码示例:
static class Consumer implements Runnable { private Exchanger<Integer> exchanger; // 确定是否是基数消费器 private boolean odd; /** * @param exchanger * @param odd */ public Consumer(Exchanger<Integer> exchanger, boolean odd) { super(); this.exchanger = exchanger; this.odd = odd; } public void run() { int remain = odd ? 1 : 0; String output = odd ? "收到偶数:" : "收到奇数:"; try { for(int i =0; i < 3; i++) { if(i % 2 == remain) { // 奇数与偶数交换数据 int result = exchanger.exchange(i); System.out.println(output + result); } } } catch (InterruptedException e) { e.printStackTrace(); } }}
主函数代码如下:
public static void main(String[] args) { Exchanger<Integer> ex = new Exchanger<>(); // 发送奇数,消费偶数 new Thread(new Consumer(ex, true)).start(); // 发送偶数,消费奇数 new Thread(new Consumer(ex, false)).start();}
最后输出结果如下:
收到偶数:0收到奇数:1
但出现了一个问题,线程无法终结,一直处于运行状态,这是因为偶数比奇数多一个,导致偶数交换线程一直在等待消费线程,解决办法有两种:
1. 双方的数量保持一致;
2. 在数据交换时加上时间限制,如下:
int result = exchanger.exchange(i, 3, TimeUnit.SECONDS);
结论
Exchanger除了能交换数据,还能协调线程的执行进度,并且能协调多个线程的进度与数据交换(网上的很多文章都说Exchanger只能处理两个线程间的数据交换,完全是错误的说法)。
阅读全文
0 0
- 并发(六):用Exchanger实现数据交换
- Java多线程/并发25、Exchanger线程数据交换
- Exchanger数据交换工具
- Exchanger:线程交换数据
- java5 Exchanger数据交换
- exchanger 线程之间交换数据
- [笔记][Java7并发编程实战手册]3.8 并发任务间的数据交换Exchanger
- Java7并发编程--3.6、Exchanger并发任务间的数据交换
- 并发编程之交换器Exchanger
- Java多线程与并发库高级应用之线程数据交换Exchanger
- JAVA中的并发工具类(四)---线程间交换数据的Exchanger类
- Java线程总结(十):并发包------两个线程交换数据Exchanger
- 控制并发线程数的Semaphore和线程之间的数据交换Exchanger
- 并发工具类(四)线程间的交换数据 Exchanger
- Java并发基础(六)-Exchanger和Semaphore
- Exchanger: 两个线程 间 交换 数据
- jdk5 Exchanger 线程之间数据交换
- jdk5 Exchanger 线程之间数据交换
- 单选对话框初识
- 高斯消元法
- c语言的改错练习
- axios post 请求参数
- iOS-icon图标
- 并发(六):用Exchanger实现数据交换
- [iOS 仿认证成功动画]
- VLC整体架构分析
- 欧几里德,斐波那契,牛顿迭代法java编程实现
- GetSidSubAuthorityCount
- Shell系列—Shell 文件包含
- 网络中立:YouTube联名上书
- php去除换行(回车换行)的三种方法
- LeetCode之机器人移动(动态规划)