Exchanger

作者: From64KB | 来源:发表于2020-11-18 10:16 被阅读0次

Exchanger用于两个线程间交换数据。说起来这个和前面讲过的SynchronousQueue比较像。但是比
SynchronousQueue功能更强大的是可以双向交换数据。

image.png

在发生数据交换的时候的行为也和SynchronousQueue比较像:

  1. 如果线程1想要和线程2交换数据,此时线程2并未准备好,那么此时线程1就会进入block状态
  2. 线程2准备好,线程1解除block状态,发生数据交换

来个示例:

    public void testExchange() {
        Exchanger<String> stringExchanger = new Exchanger<>();

        CallThread callThread = new CallThread(stringExchanger);
        AnswerThread answerThread = new AnswerThread(stringExchanger);

        callThread.start();
        answerThread.start();
    }

    static class CallThread extends Thread {
        Exchanger<String> stringExchanger;

        public CallThread(Exchanger<String> stringExchanger) {
            setName("CallThread");
            this.stringExchanger = stringExchanger;
        }

        @Override
        public void run() {
            super.run();
            try {
                String call = stringExchanger.exchange("Call");
                System.out.println(Thread.currentThread().getName() + " " + call);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class AnswerThread extends Thread {
        Exchanger<String> stringExchanger;

        public AnswerThread(Exchanger<String> stringExchanger) {
            setName("AnswerThread");
            this.stringExchanger = stringExchanger;
        }

        @Override
        public void run() {
            super.run();
            try {
                String answer = stringExchanger.exchange("Answer");
                System.out.println(Thread.currentThread().getName() + " " + answer);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

看下输出:


image.png

可以看到两个线程的数据发生了交换。

相关文章

  • Java/Android Exchanger 必知必会

    问:你知道 Java 的 Exchanger 吗?简单说说其特点及应用场景? 答:Exchanger 是 JDK ...

  • java.util.concurrent 交换机 Exchang

    交换机 Exchanger java.util.concurrent.Exchanger 类表示一种两个线程可以进...

  • Exchanger的使用

    1 Exchanger使用案例 结果

  • Exchanger

    java.util.concurrent.Exchanger 是用来支持两个线程之间交换数据,不支持更多线程。cl...

  • Exchanger

    示例 Participant Node slotExchange arenaExchange

  • Exchanger

    Exchanger用于两个线程间交换数据。说起来这个和前面讲过的SynchronousQueue[https://...

  • Exchanger

    用于两个线程之间进行交换数据。线程A执行到exchange(s)其阻塞住,并且把数据放置于格子1处;线程B执行到e...

  • Exchanger

    JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要...

  • 19.Exchanger

    Exchanger用于线程之间交换数据。 Exchanger的核心机制和Lock一样,也是CAS+park/unp...

  • java之JUC

    CountDownLatch CyclicBarrier Exchanger Future Semaphore A...

网友评论

      本文标题:Exchanger

      本文链接:https://www.haomeiwen.com/subject/alxfiktx.html