Exchanger
- Exchanger用于两个线程间的数据交换,它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。
- 使用场景:两个线程相互等待处理结果并进行数据传递。
一、Exchanger使用
public void latch() throws InterruptedException,IOException{
int count = 5;
Exchanger<String> exchanger = new Exchanger<>();
ExecutorService executorService = Executors.newFixedThreadPool(count);
for(int x = 0;x < count;x++){
executorService.execute(new Worker(x,exchanger));
}
System.in.read();
}
Class Worker extends Thread{
Integer start;
Exchanger<String> exchanger;
public Worker(Integer start,Exchanger<String> exchanger){
this.start = start;
this.exchanger = exchanger;
}
@Override
public void run() throws IllegalArgumentException{
try{
System.out.println(Thread.currentThread().getName()+"准备执行");
TimeUnit.SECONDS.sleep(start);
System.out.println(Thread.currentThread().getName()+"等待交换");
String value = exchanger.exchange(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + " 交换得到数据为:"+value);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
pool-1-thread-1 准备执行
pool-1-thread-1 等待交换
pool-1-thread-3 准备执行
pool-1-thread-2 准备执行
pool-1-thread-5 准备执行
pool-1-thread-4 准备执行
pool-1-thread-2 等待交换
pool-1-thread-1 交换得到数据为:pool-1-thread-2
pool-1-thread-2 交换得到数据为:pool-1-thread-1
pool-1-thread-3 等待交换
pool-1-thread-4 等待交换
pool-1-thread-4 交换得到数据为:pool-1-thread-3
pool-1-thread-3 交换得到数据为:pool-1-thread-4
pool-1-thread-5 等待交换
*/
备注:
Exchanger必须成对出现,否则会像上面代码执行结果那样,pool-1-thread-5一直阻塞等待与其交换数据的线程,为了避免这一现象,可以使用exchange(V x, long timeout, TimeUnit unit)设置最大等待时长
更多java基础总结(适合于java基础学习、java面试常规题):
总结篇(9)---字符串及基本类 (1)字符串及基本类之基本数据类型
总结篇(10)---字符串及基本类 (2)字符串及基本类之java中公共方法及操作
总结篇(12)---字符串及基本类 (4)Integer对象
总结篇(14)---JVM(java虚拟机) (1)JVM虚拟机概括
总结篇(15)---JVM(java虚拟机) (2)类加载器
总结篇(16)---JVM(java虚拟机) (3)运行时数据区
总结篇(17)---JVM(java虚拟机) (4)垃圾回收
总结篇(18)---JVM(java虚拟机) (5)垃圾回收算法
总结篇(19)---JVM(java虚拟机) (6)JVM调优
总结篇(24)---Java线程及其相关(2)多线程及其问题
总结篇(25)---Java线程及其相关(3)线程池及其问题
总结篇(26)---Java线程及其相关(4)ThreadLocal
总结篇(27)---Java并发及锁(1)Synchronized
总结篇(31)---JUC工具类(1)CountDownLatch
Exchanger是Java并发工具类,用于两个线程间的数据交换。在指定同步点,线程可以互相传递数据。例如,在一个多线程环境中,每个线程处理一部分任务后,通过Exchanger与其他线程交换结果。当没有匹配的交换伙伴时,线程将阻塞,可通过exchange方法设置超时避免无限等待。Exchanger常用于需要精确线程间协作的场景。
614

被折叠的 条评论
为什么被折叠?



