前言

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


简单验证用法

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

    public static void main(String[] args) {

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

                   Set 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 setB = new HashSet();//存放数据的容器
                try {
                   /*添加数据 */
                   setB.add("d");
                   setB.add("e");
                    setB.add("f");

                    Set    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();
    }
}


输出结果

java并发编程 - 舅舅不疼姥姥不爱,照样能找到适合自己的位置 - Exchanger线程数据交换_第1张图片