位置:首页 > Java > Java Exchanger在线程间交换数据的用法与示例教程

Java Exchanger在线程间交换数据的用法与示例教程

时间:2026-08-21  |  作者:宇宙开黑者  |  阅读:0

在 Ja va 的 ja va.util.concurrent 包里,有一个不太起眼但很好用的工具——Exchanger。它专门用来在两个线程之间交换数据,用起来非常直观。

可简单地将 Exchanger 对象理解为

一个带有两个“格子”的容器。

通过调用 exchange() 方法,每个线程可以把数据放进其中一个格子。当两个格子都被填满时,Exchanger 会自动把两个格子里的数据交换一下,再分别返回给对应的线程。

这样一来,两个线程就完成了信息交换,整个过程是同步且安全的。

示例代码

下面是一个最简单的示例代码,帮你快速上手:

package test;
import ja va.util.concurrent.Exchanger;
class ExchangerTest extends Thread {
    private Exchanger exchanger;
    private String string;
    private String threadName;
    public ExchangerTest(Exchanger exchanger, String string,
            String threadName) {
        this.exchanger = exchanger;
        this.string = string;
        this.threadName = threadName;
    }
    public void run() {
        try {
            System.out.println(threadName + ": " + exchanger.exchange(string));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Exchanger exchanger = new Exchanger<>();
        ExchangerTest test1 = new ExchangerTest(exchanger, "string1",
                "thread-1");
        ExchangerTest test2 = new ExchangerTest(exchanger, "string2",
                "thread-2");
        test1.start();
        test2.start();
    }
}

此程序创建了两个线程

每个线程在执行过程中,都调用同一个 Exchanger 对象的 exchange 方法,并传递自己的数据。

当两个线程都把数据放入“格子”后,Exchanger 会交换数据并返回。运行结果如下图所示:

Ja vaExchanger在两个线程间交换数据示例

使用时需要特别注意

Exchanger 只适用于两个线程的数据交换。

如果超过两个线程同时调用同一个 Exchanger 对象,结果就会变得随机。因为 Exchanger 根本不在乎线程数量,它只关心两个“格子”是否被填满。

一旦两个格子都满了,它就认为配对成功,并立即执行交换。至于跟谁配、剩余线程怎么办,它一概不管。

三个线程时会发生什么

不妨把上面的示例改一改,在第 33 行之后再加一个线程 test3,线程名设为 thread-3,交换字符串改为 string3

ExchangerTest test3 = new ExchangerTest(exchanger, "string3","thread-3");
test3.start();

此时再运行,结果就不确定了。

多次测试会发现,test1 可能和 test3 配对,也可能和 test2 配对。而那个落单的线程,因为没有配对成功,会一直阻塞在 exchange 方法上,永远等待下去——除非你强制终止它。

Ja vaExchanger多线程配对示例

总结

Exchanger 的核心设计就是“一对二”的交换。

  • 适用场景:两个线程需要同步交换数据时,它是最简洁的方案。
  • 风险点:一旦超出两个线程,行为就会变得不可控。
  • 后果:未配对的线程会永久阻塞。

所以,使用 Exchanger 时,记得按需控制线程数量。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多