学习多线程之Exchanger使用

141 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

写在前面

今天我们来学习多线程的一个知识,那就是Exchanger工具类,一个在多线程可以做到信息交换的工具,下面我们就一起来看一下具体是如何使用的吧。

学习多线程之Exchanger使用

Exchanger是一个转换器,重要是将多个线程之间的数据进行一个交换,并且可以根据这个信息来对自身线程进行一个操作。

当然了,如果其中一方没有进行的交换的时候,当前的线程就必须一直处于等待的过程中,直到另一个线程进行了交换,方可继续向下运行。

我们还是从代码示例中理解这个工具的使用方法,来看一下如下代码:

public static void main(String[] args) {
    Exchanger exchanger = new Exchanger();
    Thread thread0 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread0运行中"+System.currentTimeMillis());
            String msg = (String) exchanger.exchange("thread0前来报到");
            System.out.println("thread0收到的消息"+msg);
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread1运行中"+System.currentTimeMillis());
            String msg = (String) exchanger.exchange("thread1收到");
            System.out.println("thread1收到的消息"+msg);
        }
    });
    thread0.start();
    thread1.start();
}

运行上述代码,我们可以得到如下结果:

thread0运行中1645942968676

thread1运行中1645942968676

thread1收到的消息thread0前来报到

thread0收到的消息thread1收到

从结果上面来看,我们得到了预期的效果,大概来解释一下这段代码的含义吧。

首先声明了Exchanger对象,还有两个线程。

第一个线程向另一个线程发送一个消息,这个消息就是thread0前来报到,这个时候就需要线程thread1来进行数据的交换了。

所以在thread1线程中运行时,也同样使用了exchange方法,来传递了一个已经收到的信息。

并且这两个线程在接受到对方的消息后,分别也打印了接收到的消息。

由此可见,我们的结果是正确的,大家也可以自行去试一下,体验一下这个工具的使用。