Exchanger实现线程间数据交换
2024-08-26 09:45:34
package com.duchong.concurrent; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger; /**
* Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,
* 如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,
* 将本线程生产出来的数据传递给对方。
* @author DUCHONG
* @since 2019-09-18 10:20
**/
public class ExchangeDemo { static final Exchanger<List<String>> exchanger = new Exchanger<>(); public static void main(String[] args) { new Thread(()->putDataA()).start(); new Thread(()->putDataB()).start(); } public static void putDataA(){ System.out.println("putDataA:");
String name = Thread.currentThread().getName();
System.out.println(name);
try {
List<String> list = new ArrayList<>();
list.add(name+"---a1");
list.add(name+"---a2"); list = exchanger.exchange(list); for(String data:list){
System.out.println("putDataA:"+data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void putDataB(){ System.out.println("putDataB:");
String name = Thread.currentThread().getName();
System.out.println(name);
try { List<String> list = new ArrayList<>();
list.add(name+"---b1");
list.add(name+"---b2");
list.add(name+"---b3");
list.add(name+"---b4");
list.add(name+"---b5"); Thread.sleep(2000);
list = exchanger.exchange(list); for(String data:list){
System.out.println("putDataB:"+data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
最新文章
- ASP.NET免费服务器~支持MVC和Net4.5
- Windows进程间通信—命名管道
- Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
- GO语言练习:channel 缓冲机制
- bzoj3035: 导弹防御塔
- 如何设置适当的ramp-up period值
- BZOJ 4127 Abs 解题报告
- Oracle数据库之PL/SQL包
- Error (0xc0000225) installing Windows 8 R2 on VirtualBox
- digitalocean纽约机房最先开通IPv6
- .net 图片压缩
- 简单使用sp_executesql 参数化
- H5页面测试实战总结
- day14
- mqtt mosquitto 源码安装
- hexo+next主题目录解析
- 第二十七篇-新建Activity
- Deploy, Issue and Transfer Tokens
- VS在解决方案中添加一个别人给的项目,我自己的项目主窗体中不能调用
- JDK的下载及配置