写点什么

【JUC】交换器 Exchanger 详解

作者:JAVA旭阳
  • 2022-12-02
    浙江
  • 本文字数:1532 字

    阅读完需:约 5 分钟

【JUC】交换器Exchanger详解

欢迎关注专栏【JAVA并发】

更多技术干货尽在个人公众号——JAVA 旭阳

前言

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,


  1. A 线程交换数据时,发现 slot 为空,则将需要交换的数据放在 slot 中, 阻塞当前线程,等待其它线程进来交换数据

  2. 等线程 B 进来,读取 A 设置的数据,然后设置线程 B 需要交换的数据,然后唤醒 A 线程。


Exchanger的源码实现大家感兴趣的话,自己可以看看。

总结

本文讲解了交换器Exchanger,是 jdk5 中引入的一个同步器。实际上在平时工作场景中基本上很少应用,按照官方注释说可以应用在基因算法或者管道设计,太抽象了,大家就当扩扩知识面吧。


如果本文对你有帮助的话,请留下一个赞吧

发布于: 刚刚阅读数: 10
用户头像

JAVA旭阳

关注

欢迎关注个人公众号—— JAVA旭阳 2018-07-18 加入

还未添加个人简介

评论

发布
暂无评论
【JUC】交换器Exchanger详解_Java_JAVA旭阳_InfoQ写作社区