iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java开发JUC交换器Exchanger使用详解
  • 419
分享到

Java开发JUC交换器Exchanger使用详解

JavaJUC交换器ExchangerJUC交换器 2022-12-08 20:12:58 419人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言Exchanger介绍api介绍Exchanger使用实现机制总结前言 jdk中提供了不少的同步工具,现在分享一个相对比较冷门的同步工具——交换器(E

前言

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 JUC交换器Exchanger的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java开发JUC交换器Exchanger使用详解

本文链接: https://www.lsjlt.com/news/174378.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java开发JUC交换器Exchanger使用详解
    目录前言Exchanger介绍API介绍Exchanger使用实现机制总结前言 JDK中提供了不少的同步工具,现在分享一个相对比较冷门的同步工具——交换器(E...
    99+
    2022-12-08
    Java JUC交换器Exchanger JUC交换器
  • Java中JUC 的 Exchange 交换器详情
    目录前言基础使用总结前言 Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5, 它有两个核心方法: exchange(V x):等待另一...
    99+
    2024-04-02
  • 解析Java并发Exchanger的使用
    目录类定义类继承构造函数具体的例子结语类定义 public class Exchanger<V> 其中V表示需要交换的对象类型。 类继承 java.lang.Obj...
    99+
    2024-04-02
  • java并发数据包Exchanger线程间的数据交换器
    java.util.concurrent.Exchanger可以用来进行数据交换,或者被称为“数据交换器”。两个线程可以使用Exchanger交换数据,下图用...
    99+
    2024-04-02
  • Java Spring的使用注解开发详解
    目录使用注解开发1.bean2.属性如何注入3.衍生的注解4.自动装配5.作用域6.小结代码show1.新建一个模块:2.新建pojo包及类3.新建dao包及类4.新建service...
    99+
    2024-04-02
  • java开发使用StringUtils.split避坑详解
    目录正文StringUtils.split 的坑StringUtils.split 源码分析如何解决?正文 在日常的 Java 开发中,由于 JDK 未能提供足够的常用的操作类库,...
    99+
    2022-11-13
    java开发StringUtils.split避坑 java StringUtils split
  • Java开发神器Lombok安装与使用详解
    目录安装Idea插件的安装maven中pom文件的导入使用val@Data@Getter/@Setter@Log4j@AllArgsConstructor@NoArgsConstru...
    99+
    2024-04-02
  • 怎么使用java开发语音交流机器人
    要使用Java开发语音交流机器人,可以使用一些现有的Java库和工具来实现。以下是一些步骤:1. 选择一个语音识别和语音合成的API...
    99+
    2023-08-28
    java
  • Android开发AsmClassVisitorFactory使用详解
    目录前言AsmClassVisitorFactory新的Extension实战ClassVisitor实际代码分析个人观点前言 之前就和大家介绍过AGP(Android Gradle...
    99+
    2024-04-02
  • python使用pika库调用rabbitmq交换机模式详解
    目录1、交换机之发布订阅2、交换机之关键字3、交换机之通配符前言: 交换机模式主要包括:交换机之发布订阅、交换机之关键字和交换机之通配符。 1、交换机之发布订阅  发布订...
    99+
    2024-04-02
  • Java NIO服务器端开发详解
    一、NIO类库简介  1、缓冲区Buffer  Buffer是一个对象,包含一些要写入和读出的数据。  在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道...
    99+
    2023-05-30
    java nio 服务器
  • Web应用开发TypeScript使用详解
    目录一、什么是 TypeScript二、TypeScript 简史三、为什么我们要使用TypeScript?TypeScript的附加功能四、大牛现身说法:五、你可能不知道的Type...
    99+
    2024-04-02
  • java ReentrantLock并发锁使用详解
    目录一、ReentrantLock是什么1-1、ReentrantLock和synchronized区别1-2、ReentrantLock的使用1-2-1、ReentrantLock...
    99+
    2022-11-13
    java ReentrantLock并发锁 java ReentrantLock
  • 详解Java对象转换神器MapStruct库的使用
    目录前言MapStruct简介MapStruct入门1. 引入依赖2. 需要转换的对象3. 创建转换器4. 验证5. 自动生成的实现类MapStruct进阶场景1:属性名称不同、(基...
    99+
    2024-04-02
  • Spring详解使用注解开发流程
    目录在Spring4之后 要使用注解开发 必须保证aop包导入了 使用注解需要导入context约束 增加 注解的支持 <xml version="1.0" encoding...
    99+
    2024-04-02
  • 详解spring如何使用注解开发
    在Spring4之后,要使用注解开发,必须要保证aop的包导入了。 使用注解需要导入context约束,增加注解的支持。 <?xml version="1.0" ...
    99+
    2024-04-02
  • Android开发中amera2 Preview使用详解
    目录前言一、Camera2 Preview需要用到哪些模块二、各个模块的功能和之间的关系2.1 SurfaceTexture之SurfaceTextureListener2.1.1 ...
    99+
    2024-04-02
  • Hutool开发利器MapProxy类使用技巧详解
    目录概述场景引入MapProxy使用MapProxy源码解析总结概述 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java...
    99+
    2024-04-02
  • vue前端开发keepAlive使用详解
    目录前言keep-avlive钩子函数keep-avlive缓存哪些组件小结及注意事项前言 keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,...
    99+
    2024-04-02
  • Java开发中为什么要使用单例模式详解
    目录一、什么是单例模式?二、实战案例一:处理资源访问冲突三、实战案例二:表示全局唯一类一、什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作