当前位置: 代码迷 >> 综合 >> 并发编程(11):Exchanger的基本使用与实现原理
  详细解决方案

并发编程(11):Exchanger的基本使用与实现原理

热度:67   发布时间:2023-10-24 15:56:38.0

1、什么是Exchanger?

      Exchanger 顾名思义它是交互器,交换什么呢?怎么交换?是不是一堆小问号,下面一 一来解答,交换的是线程之间的数据,调用Exchanger.exchange(V x)方法就能交互。

 

2、使用案例:

public class ExchangerDemo {static  Exchanger<String> exchanger = new Exchanger <>();public static void main(String[] args) {String t1String = "T1";String t2String = "T2";new Thread(()->{try {System.out.println("T1交换之前的值:" + t1String);String exchange = exchanger.exchange(t1String);System.out.println("T1交换之后的值:" + exchange);} catch (InterruptedException e) {e.printStackTrace();}},"T1").start();new Thread(()->{try {System.out.println("T2交换之前的值:" + t2String);String exchange = exchanger.exchange(t2String);System.out.println("T2交换之后的值:" + exchange);} catch (InterruptedException e) {e.printStackTrace();}},"T2").start();}
}

 

   案例输出:T1交换之前的值:T1
                     T2交换之前的值:T2
                     T2交换之后的值:T1
                     T1交换之后的值:T2

      丛输出结果可以看出T1、T2线程实现了数据交换,当T1线程调用exchanger.exchange(t1String)的时候就表示它把t1String拿出来跟其他线程做交换,当有T2调用exchanger.exchange(t2String)的时候就表示把t2String拿出来跟其他线程做交互,当有两条线程要做交换的时候,Exchanger就满足了交换的条件,就会进行值的交换,并且把交换后的值返回。

 

3、使用注意点:

      1、需要交换值的线程必须是成对的出现。

      2、当有两条线程将值交换完成后,Exchanger实例可重复使用,其他线程也可以使用此Exchanger实例来进行数据交换。

 

4、Exchanger的实现原理:

      Exchanger交换值的原理是使用了ThreadLocal来实现的,至于线程阻塞的部分是使用java中的Usafe类park()/unpark()来实现的。