Java并发编程中的Exchanger解析

 更新时间:2023年11月30日 08:49:11   作者:MC-闰土  
这篇文章主要介绍了Java并发编程中的Exchanger解析,Exchanger用于线程间数据的交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,需要的朋友可以参考下

概述

用于线程间数据的交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

Exchanger 可被视为 SynchronousQueue 的双向形式。Exchanger在遗传算法和管道设计等应用中很有用。

内存一致性:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。

方法

提供的方法:

    // 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    public V exchange(V x) throws InterruptedException
    //增加超时机制,超过指定时间,抛TimeoutException异常
    public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

使用示例

该类使用 Exchanger 在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给清空缓冲区的线程。

class FillAndEmpty {
    Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
    DataBuffer initialEmptyBuffer = ... a made-up type
    DataBuffer initialFullBuffer = ...
    
    //填充缓冲区线程
    class FillingLoop implements Runnable {
        public void run() {
            DataBuffer currentBuffer = initialEmptyBuffer;    //空的缓冲区
            try {
                while (currentBuffer != null) {
                    addToBuffer(currentBuffer);    //填充数据
                    //如果缓冲区被数据填满,执行exchange。等待清空缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。
                    if (currentBuffer.isFull())
                        currentBuffer = exchanger.exchange(currentBuffer);    
                }
            } catch (InterruptedException ex) { ... handle ... }
        }
    }
    
    //清空缓冲区线程
    class EmptyingLoop implements Runnable {
        public void run() {
            DataBuffer currentBuffer = initialFullBuffer;    //满的缓冲区
            try {
                while (currentBuffer != null) {
                    takeFromBuffer(currentBuffer);    //清空缓冲区
                    //如果缓冲区被清空,执行exchange。等待填充缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。
                    if (currentBuffer.isEmpty())
                        currentBuffer = exchanger.exchange(currentBuffer);
                }
            } catch (InterruptedException ex) { ... handle ...}
        }
    }
 
    void start() {
        new Thread(new FillingLoop()).start();
        new Thread(new EmptyingLoop()).start();
    }
}

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

相关文章

  • Spring Jpa多数据源工程配置过程解析

    Spring Jpa多数据源工程配置过程解析

    这篇文章主要介绍了Spring Jpa多数据源工程配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java内部类详解

    Java内部类详解

    内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点。
    2020-02-02
  • 解决spring boot启动扫描不到自定义注解的问题

    解决spring boot启动扫描不到自定义注解的问题

    这篇文章主要介绍了解决spring boot启动扫描不到自定义注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java设计模式之原型模式的示例详解

    Java设计模式之原型模式的示例详解

    原型模式(Prototype Pattern)指使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。本文将通过案例详细讲解一下原型模式,感兴趣的可以了解一下
    2022-02-02
  • SpringBoot监视器的具体使用

    SpringBoot监视器的具体使用

    Spring Boot监视器是一个用于监控和管理Spring Boot应用程序的工具集,本文就来介绍一下SpringBoot监视器的具体使用,感兴趣的可以了解一下
    2025-01-01
  • Java中的this、super、final关键字详解

    Java中的this、super、final关键字详解

    这篇文章主要介绍了Java中的this、super、final关键字详解,它在方法内部使用,表示这个方法所属对象的引用,它在构造器内部使用,表示该构造器正在初始化的对象,this 可以调用类的属性、方法和构造器,需要的朋友可以参考下
    2023-09-09
  • sprintboot使用spring-security包,缓存内存与redis共存方式

    sprintboot使用spring-security包,缓存内存与redis共存方式

    这篇文章主要介绍了sprintboot使用spring-security包,缓存内存与redis共存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • javaweb中Http协议详解

    javaweb中Http协议详解

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。这篇文章主要为大家详细介绍了javaweb中的Http协议,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java如何导入Jsoup库做一个有趣的爬虫项目

    Java如何导入Jsoup库做一个有趣的爬虫项目

    Jsoup库是一款Java的HTML解析器,可用于从网络或本地文件中获取HTML文档并解析其中的数据,这篇文章给大家介绍Java导入Jsoup库做一个有趣的爬虫项目,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 浅谈Java三目运算

    浅谈Java三目运算

    本文给大家主要介绍的是java中三目运算的详细介绍,并附上2个示例,希望对大家理解三目运算能够有所帮助。
    2015-03-03

最新评论