java并发Exchanger的使用

简介: java并发Exchanger的使用

目录



简介


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。


  1. 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

相关文章
|
8天前
|
安全 Java Go
Java vs. Go:并发之争
【4月更文挑战第20天】
15 1
|
8天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
9天前
|
Java API
[Java 并发基础]多线程编程
[Java 并发基础]多线程编程
|
9天前
|
安全 Java 调度
[Java并发基础] 共享内存
[Java并发基础] 共享内存
|
9天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
9天前
|
设计模式 Java 编译器
深入理解Java中的多线程并发控制
Java作为一种流行的编程语言,其多线程并发控制机制一直是开发者关注的焦点。本文旨在通过探讨Java中的多线程并发控制原理、常用同步工具及设计模式,帮助读者深入理解并有效应用多线程并发控制技术,以提高程序性能和稳定性。
|
10天前
|
监控 安全 Java
一文讲明白Java中线程与进程、并发与并行、同步与异步
一文讲明白Java中线程与进程、并发与并行、同步与异步
7 1
|
14天前
|
监控 安全 Java
【JavaEE多线程】深入解析Java并发工具类与应用实践
【JavaEE多线程】深入解析Java并发工具类与应用实践
30 1
|
14天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
16天前
|
安全 算法 Java
Java中的多线程并发控制与同步机制
【4月更文挑战第17天】 在现代软件开发中,Java作为一种广泛使用的编程语言,其对多线程的支持是构建高性能应用程序的关键。本文将深入探讨Java中的多线程并发控制与同步机制,包括基本的线程创建、生命周期管理,以及高级的并发工具如synchronized关键字、ReentrantLock类、并发集合和原子变量等。通过理论分析与实例演示,旨在为读者提供一个清晰的多线程并发控制与同步的实现框架,并指出在实践中如何避免常见的并发问题,如死锁、竞态条件和资源争用等。