解析Java并发Exchanger的使用

 更新时间:2021年06月01日 13:09:42   作者:flydean  
Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。两个线程都调用exchange方法之后,传入的参数就会交换。

类定义

public class Exchanger<V>

其中V表示需要交换的对象类型。

类继承

java.lang.Object

java.util.concurrent.Exchanger<V>

Exchanger直接继承自Object。

构造函数

Exchanger() 

Exchanger提供一个无参构造函数。

两个主要方法

1.public V exchange(V x) throws InterruptedException

当这个方法被调用的时候,当前线程将会等待直到其他的线程调用同样的方法。当其他的线程调用exchange之后,当前线程将会继续执行。

在等待过程中,如果有其他的线程interrupt当前线程,则会抛出InterruptedException。

2.public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

和第一个方法类似,区别是多了一个timeout时间。如果在timeout时间之内没有其他线程调用exchange方法,则会抛出TimeoutException。

具体的例子

我们先定义一个带交换的类:

@Data
public class CustBook {

    private String name;
}

然后定义两个Runnable,在run方法中调用exchange方法:

@Slf4j
public class ExchangerOne implements Runnable{

    Exchanger<CustBook> ex;

    ExchangerOne(Exchanger<CustBook> ex){
      this.ex=ex;
    }

    @Override
    public void run() {
    CustBook custBook= new CustBook();
        custBook.setName("book one");

        try {
            CustBook exhangeCustBook=ex.exchange(custBook);
            log.info(exhangeCustBook.getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
@Slf4j
public class ExchangerTwo implements Runnable{

    Exchanger<CustBook> ex;

    ExchangerTwo(Exchanger<CustBook> ex){
      this.ex=ex;
    }

    @Override
    public void run() {
    CustBook custBook= new CustBook();
        custBook.setName("book two");

        try {
            CustBook exhangeCustBook=ex.exchange(custBook);
            log.info(exhangeCustBook.getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

最后在主方法中调用:

public class ExchangerUsage {

    public static void main(String[] args) {
        Exchanger<CustBook> exchanger = new Exchanger<>();
        // Starting two threads
        new Thread(new ExchangerOne(exchanger)).start();
        new Thread(new ExchangerTwo(exchanger)).start();
    }
}

我们看下结果:

22:14:09.069 [Thread-1] INFO com.flydean.ExchangerTwo - book one

22:14:09.073 [Thread-0] INFO com.flydean.ExchangerOne - book two

可以看到对象已经被交换了。

结语

Exchanger在两个线程需要交换对象的时候非常好用。大家可以在实际工作生活中使用。

本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger

以上就是解析Java并发Exchanger的使用的详细内容,更多关于Java并发Exchanger的使用的资料请关注脚本之家其它相关文章!

相关文章

  • java CompletableFuture实现异步编排详解

    java CompletableFuture实现异步编排详解

    这篇文章主要为大家介绍了java CompletableFuture实现异步编排详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • SpringBoot+Shiro+LayUI权限管理系统项目源码

    SpringBoot+Shiro+LayUI权限管理系统项目源码

    本项目旨在打造一个基于RBAC架构模式的通用的、并不复杂但易用的权限管理系统,通过SpringBoot+Shiro+LayUI权限管理系统项目可以更好的帮助我们掌握springboot知识点,感兴趣的朋友一起看看吧
    2021-04-04
  • springboot的类加载器(org.springframework.boot.loader)过程详解

    springboot的类加载器(org.springframework.boot.loader)过程详解

    这篇文章主要介绍了springboot的类加载器(org.springframework.boot.loader),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 快速理解Java设计模式中的组合模式

    快速理解Java设计模式中的组合模式

    这篇文章主要介绍了快速理解Java设计模式中的组合模式,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java ThreadLocal的使用详解

    Java ThreadLocal的使用详解

    ThreadLocal是线程私有的局部变量存储容器,可以理解成每个线程都有自己专属的存储容器,用来存储线程私有变量。ThreadLocal 在日常开发框架中应用广泛,但用不好也会出现各种问题,本文就此讲解一下。
    2021-05-05
  • Java线程池ThreadPoolExecutor原理及使用实例

    Java线程池ThreadPoolExecutor原理及使用实例

    这篇文章主要介绍了Java线程池ThreadPoolExecutor原理及使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java Hibernate使用SessionFactory创建Session案例详解

    Java Hibernate使用SessionFactory创建Session案例详解

    这篇文章主要介绍了Java Hibernate使用SessionFactory创建Session案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring IOC中对象的创建、策略及销毁时机和生命周期详解

    Spring IOC中对象的创建、策略及销毁时机和生命周期详解

    这篇文章主要介绍了Spring IOC中对象的创建、策略及销毁时机和生命周期详解,Spring默认使用类的空参构造方法创建bean,假如类没有空参构造方法,将无法完成bean的创建,需要的朋友可以参考下
    2023-08-08
  • springboot 如何使用jedis连接Redis数据库

    springboot 如何使用jedis连接Redis数据库

    这篇文章主要介绍了springboot 使用jedis连接Redis数据库的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot@Componet注解注入失败的问题

    SpringBoot@Componet注解注入失败的问题

    这篇文章主要介绍了SpringBoot@Componet注解注入失败的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论