Exchanger (交换器)

Exchanger 用于两个线程之间的数据交换

public class ExchangerDemo {
    static Exchanger<String> exchanger = new Exchanger<>();

    public static void main(String[] args) {
        new Thread(()->{
            String s = "T1";
            try {
                s = exchanger.exchange(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + s);

        }, "t1").start();


        new Thread(()->{
            String s = "T2";
            try {
                s = exchanger.exchange(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + s);

        }, "t2").start();
    }
}

注意,如果一个线程调用了 exchange, 另一个线程没有调用或者怎么,会导致第一个线程一直被阻塞,永久等待,直到有可以进行配对的线程;

而且这仅限于两个线程,当出现第三个线程的时候就会随机交换,因为不确定是哪个跟 哪个的交换

最后修改:2022 年 01 月 15 日 11 : 12 PM