Java高并发中的交换器Exchanger解析

 更新时间:2023年12月02日 10:07:34   作者:safe_u  
这篇文章主要介绍了Java高并发中的交换器Exchanger解析,如果两个线程并行处理,但在某个时刻需要互相交换自己已经处理完的中间数据,然后才能继续往下执行,这个时候就可以使用 Exchanger,需要的朋友可以参考下

1.Exchanger简介

Exchanger — 交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。

如果两个线程并行处理,但在某个时刻需要互相交换自己已经处理完的中间数据,然后才能继续往下执行。这个时候就可以使用 Exchanger。

Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,如果已经有其它线程(Thread2)已经到达了,就会以成对的方式交换各自携带的信息,因此Exchanger非常适合用于两个线程之间的数据交换。

2.Exchanger的使用

2.1 常用方法

//实现数据交换,x是交换的数据,V是返回对方线程传递的数据
public V exchange(V x) throws InterruptedException
​
//用于交换,启动交换并等待另一个线程调用exchange,并且设置最大等待时间,当等待时间超过timeout便停止等待。
public V exchange(V x, long timeout, TimeUnit unit)

2.2 使用举例

//数据交换器,用于数据交换
        Exchanger<String> exchanger = new Exchanger<>();
​
        //换书线程1
        new Thread(()->{
            String[] books_A = new String[]{"C++","操作系统"};//图书数组
            for (String bookNameA:books_A) {
                try {
                    //交换数据,bookNameA为我的书,exBook_A为我换回来的书
                    //System.out.println("线程A准备提交《"+bookNameA+"》书籍,等待交换...");
                    String exBook_A = exchanger.exchange(bookNameA);
                    System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameA+"》换《"+exBook_A+"》");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
​
        },"线程A").start();
​
        //换书线程2
        new Thread(()->{
            String[] books_B = new String[]{"Java攻略","并发编程"};//图书数组
            for (String bookNameB:books_B) {
                try {
                    String exBook_B = exchanger.exchange(bookNameB);
                    System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameB+"》换《"+exBook_B+"》");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程B").start();
  • Exchanger 支持多个线程做数据交换;
  • 多个线程使用同一个 Exchanger 做数据交换时,结果随机,只要凑满一对,就会进行交换。

到此这篇关于Java高并发中的交换器Exchanger解析的文章就介绍到这了,更多相关Java的Exchanger内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot接口防抖(防重复提交)的实现方法

    SpringBoot接口防抖(防重复提交)的实现方法

    SpringBoot接口防抖主要通过前端和后端两种方式实现,前端通过JavaScript控制用户操作,后端通过拦截器、过滤器等机制控制请求频率,文中介绍的非常详细,感兴趣的可以了解一下
    2024-11-11
  • SpringBoot超详细讲解yaml配置文件

    SpringBoot超详细讲解yaml配置文件

    这篇文章主要介绍了SpringBoot中的yaml配置文件问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • java使用poi读取excel内容方法实例

    java使用poi读取excel内容方法实例

    本文介绍java使用poi读取excel内容的实例,大家参考使用吧
    2014-01-01
  • Java计算几何图形面积的实例代码

    Java计算几何图形面积的实例代码

    这篇文章主要介绍了Java计算几何图形面积的实例代码,需要的朋友可以参考下
    2014-03-03
  • Spring的BeanUtils.copyProperties属性复制避坑指南

    Spring的BeanUtils.copyProperties属性复制避坑指南

    这篇文章主要介绍了Spring的BeanUtils.copyProperties属性复制避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    Java文件操作工具类fileUtil实例【文件增删改,复制等】

    这篇文章主要介绍了Java文件操作工具类fileUtil,结合实例形式分析了java针对文件进行读取、增加、删除、修改、复制等操作的相关实现技巧,需要的朋友可以参考下
    2017-10-10
  • 启动 Spring 或 Spring Boot 项目需要 Tomcat的原因解析

    启动 Spring 或 Spring Boot 项目需要 T

    本文的内容是学习关于Tomcat的基本知识,介绍了Tomcat为什么是一个 Web 应用服务器,为什么是 Servlet 容器,同时总结了 Tomcat 的一些功能原理,并详细介绍了 Tomcat 在 Spring 和SpringBoot 项目中的使用原理,本文不涉及安装和使用说明,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 详解如何有效地处理Java中的多线程

    详解如何有效地处理Java中的多线程

    在现代软件开发中,多线程编程已成为提高程序性能和响应速度的重要手段,Java提供了丰富的多线程支持,使得在Java中实现并发操作变得相对简单,本文将深入探讨Java多线程编程的基本概念、常见问题和最佳实践,需要的朋友可以参考下
    2024-06-06
  • Java Apache common-pool对象池介绍

    Java Apache common-pool对象池介绍

    这篇文章主要介绍了Java Apache common-pool对象池介绍,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • Java自定义实现equals()方法过程解析

    Java自定义实现equals()方法过程解析

    这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论