【JUC】交换器Exchanger详解
前言
JDK中提供了不少的同步工具,现在分享一个相对比较冷门的同步工具——交换器(Exchanger
)。你知道Exchanger
的作用是什么吗?实现机制是什么?可以用来做什么呢?
Exchanger介绍
交换器(Exchanger
),顾名思义,用于两个线程之间进行数据交换的。
简单来说,就是一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。如下图所示:
两个线程通过 exchange()
方法交换数据,如果第一个线程先执行 exchange()
方法,它会一直等待第二个线程也执行 exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据
API介绍
构造方法
Exchanger()
:创建一个交换器
常用方法
V exchange(V x)
: 交换数据,如果只有一个线程,会阻塞,直到另外一个线程也调用exchange, 支持中断V exchange(V x, long timeout, TimeUnit unit)
: 带超时参数的交换数据
Exchanger使用
这不,马上圣诞节要到了,你要和你对象交换礼物,不准备的话,你就要死的很惨~~我们就可以用Exchanger
来实现。
@Slf4j(topic = "c.ExchangerTest")
public class ExchangerTest {
public static void main(String[] args) throws InterruptedException {
Exchanger<String> exchanger = new Exchanger<>();
Thread boy = new Thread(new Runnable() {
@Override
public void run() {
log.info("你开始准备礼物~~~~~~~~~~~~");
try {
// 模拟准备礼物时间
Thread.sleep(5000);
String gift = "IPhone 14";
log.info("你送了礼物: {}", gift);
String recGift = exchanger.exchange(gift);
log.info("你收到了礼物: {}", recGift);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread girl = new Thread(new Runnable() {
@Override
public void run() {
log.info("女朋友开始准备礼物~~~~~~~~~~~~");
try {
// 模拟准备礼物时间
Thread.sleep(6000);
String gift = "一个吻";
log.info("女朋友送了礼物: {}", gift);
String recGift = exchanger.exchange(gift);
log.info("女朋友收到了礼物: {}", recGift);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
boy.start();
girl.start();
boy.join();
girl.join();
}
}
运行结果:
- 中间阻塞等待了一秒,直到你女朋友也准备好了礼物。
实现机制
实现机制也很容易能够想到,Exchanger
类中定义一个槽位slot
,
- A线程交换数据时,发现slot为空,则将需要交换的数据放在slot中, 阻塞当前线程,等待其它线程进来交换数据
- 等线程B进来,读取A设置的数据,然后设置线程B需要交换的数据,然后唤醒A线程。
Exchanger
的源码实现大家感兴趣的话,自己可以看看。
总结
本文讲解了交换器Exchanger
,是jdk5中引入的一个同步器。实际上在平时工作场景中基本上很少应用,按照官方注释说可以应用在基因算法或者管道设计,太抽象了,大家就当扩扩知识面吧。
如果本文对你有帮助的话,请留下一个赞吧
更多技术干活欢迎关注公众号——JAVA旭阳
本文来自博客园,作者:JAVA旭阳,转载请注明原文链接:https://www.cnblogs.com/alvinscript/p/16964432.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?