前言

作为java并发编程的工具之一的Exchanger交换器只支持2个线程之间的数据互换。当线程A需要在内部同线程B交换各自的数据时,调用exchange()后,会自动阻塞等待对方线程数据到达,然后进行交换。它内部采用CAS机制实现数据之间的互换功能。


简单验证用法

public class UseExchange {
    private static final Exchanger<Set<String>> exchange = new Exchanger<Set<String>>();

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
               Set<String> setA = new HashSet<String>();//存放数据的容器
                try {
                   /*添加数据*/
                   setA.add("a");
                    setA.add("b");
                    setA.add("c");

                   Set<String> setB = exchange.exchange(setA);//交换set
                   /*处理交换后的数据*/
                    System.out.println("打印setA和setB交换后的数据:");
                    for (String s : setB){
                        System.out.println(s);
                    }
                    System.out.println("=============换来了setB================");
                } catch (InterruptedException e) {
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
               Set<String> setB = new HashSet<String>();//存放数据的容器
                try {
                   /*添加数据 */
                   setB.add("d");
                   setB.add("e");
                    setB.add("f");

                    Set<String>    setA = exchange.exchange(setB);//交换set
                   /*处理交换后的数据*/
                    System.out.println("打印setB和setA交换后的数据:");
                    for (String s : setA){
                        System.out.println(s);
                    }
                    System.out.println("=============换来了setA================");
                } catch (InterruptedException e) {
                }
            }
        }).start();
    }
}


输出结果

image.png