Java Exchanger在线程间交换数据的用法与示例教程
时间:2026-08-21 | 作者:宇宙开黑者 | 阅读:0在 Ja va 的 ja va.util.concurrent 包里,有一个不太起眼但很好用的工具——Exchanger。它专门用来在两个线程之间交换数据,用起来非常直观。
可简单地将 Exchanger 对象理解为
一个带有两个“格子”的容器。
通过调用 exchange() 方法,每个线程可以把数据放进其中一个格子。当两个格子都被填满时,Exchanger 会自动把两个格子里的数据交换一下,再分别返回给对应的线程。
这样一来,两个线程就完成了信息交换,整个过程是同步且安全的。
示例代码
下面是一个最简单的示例代码,帮你快速上手:
package test;
import ja va.util.concurrent.Exchanger;
class ExchangerTest extends Thread {
private Exchanger exchanger;
private String string;
private String threadName;
public ExchangerTest(Exchanger exchanger, String string,
String threadName) {
this.exchanger = exchanger;
this.string = string;
this.threadName = threadName;
}
public void run() {
try {
System.out.println(threadName + ": " + exchanger.exchange(string));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
Exchanger exchanger = new Exchanger<>();
ExchangerTest test1 = new ExchangerTest(exchanger, "string1",
"thread-1");
ExchangerTest test2 = new ExchangerTest(exchanger, "string2",
"thread-2");
test1.start();
test2.start();
}
}
此程序创建了两个线程
每个线程在执行过程中,都调用同一个 Exchanger 对象的 exchange 方法,并传递自己的数据。
当两个线程都把数据放入“格子”后,Exchanger 会交换数据并返回。运行结果如下图所示:
使用时需要特别注意
Exchanger 只适用于两个线程的数据交换。
如果超过两个线程同时调用同一个 Exchanger 对象,结果就会变得随机。因为 Exchanger 根本不在乎线程数量,它只关心两个“格子”是否被填满。
一旦两个格子都满了,它就认为配对成功,并立即执行交换。至于跟谁配、剩余线程怎么办,它一概不管。
三个线程时会发生什么
不妨把上面的示例改一改,在第 33 行之后再加一个线程 test3,线程名设为 thread-3,交换字符串改为 string3:
ExchangerTest test3 = new ExchangerTest(exchanger, "string3","thread-3"); test3.start();
此时再运行,结果就不确定了。
多次测试会发现,test1 可能和 test3 配对,也可能和 test2 配对。而那个落单的线程,因为没有配对成功,会一直阻塞在 exchange 方法上,永远等待下去——除非你强制终止它。
总结
Exchanger 的核心设计就是“一对二”的交换。
- 适用场景:两个线程需要同步交换数据时,它是最简洁的方案。
- 风险点:一旦超出两个线程,行为就会变得不可控。
- 后果:未配对的线程会永久阻塞。
所以,使用 Exchanger 时,记得按需控制线程数量。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- Java异常处理实战:从体系架构到健壮性设计全解
- 时间:2026-08-27
-
- 基于Spring Security实现自动登录的完整指南
- 时间:2026-08-27
-
- VS Code Java开发高效配置清单(可直接复制使用)
- 时间:2026-08-27
-
- JavaSwing实现自定义TablePanel组件(附完整代码)
- 时间:2026-08-27
-
- Java基础攻略:输入输出、方法与数组实战指南
- 时间:2026-08-27
-
- Java反射、枚举、Lambda表达式及泛型通配符实例详解
- 时间:2026-08-27
-
- 30个经典算法题及Java解答(含实例代码)
- 时间:2026-08-27
-
- Spring Data JPA 查询实战:方法命名与 @Query 注解详解
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15

