Exchanger用于两个线程间交换数据,调用exchange()方法时双方阻塞直至完成数据交换,适用于双缓冲、任务结果互传等场景,支持超时机制避免无限等待,需注意仅限两线程使用以防配对混乱。

Exchanger 是 Java 并发包 java.util.concurrent 中的一个工具类,用于两个线程之间交换数据。它提供了一个同步点,两个线程可以在此处交换各自持有的对象。当一个线程调用 exchange() 方法时,它会等待另一个线程也调用该方法,然后两者交换数据并继续执行。
Exchanger 适用于两个线程需要双向传递数据的场景,比如生产者和消费者之间批量交换缓冲区,或者两个协作线程交换任务结果。
关键方法是 exchange(V x),它会阻塞直到另一个线程也调用 exchange()。
示例代码:
立即学习“Java免费学习笔记(深入)”;
下面是一个简单的例子,两个线程分别生成数据,并通过 Exchanger 交换它们的内容:
import java.util.concurrent.Exchanger;
public class ExchangerExample {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
new Thread(() -> {
String data = "来自线程 A 的数据";
try {
System.out.println("线程 A 准备交换...");
String received = exchanger.exchange(data);
System.out.println("线程 A 接收到: " + received);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}, "Thread-A").start();
new Thread(() -> {
String data = "来自线程 B 的数据";
try {
System.out.println("线程 B 准备交换...");
String received = exchanger.exchange(data);
System.out.println("线程 B 接收到: " + received);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}, "Thread-B").start();
}
}输出可能为:
线程 A 准备交换... 线程 B 准备交换... 线程 A 接收到: 来自线程 B 的数据 线程 B 接收到: 来自线程 A 的数据
Exchanger 还支持设置超时的 exchange 方法:exchange(V x, long timeout, TimeUnit unit)。如果在指定时间内没有另一个线程参与交换,会抛出 TimeoutException。
这适合对响应时间有要求的场景。
示例:使用超时机制
import java.util.concurrent.*;
new Thread(() -> {
try {
String result = exchanger.exchange("Data from C", 2, TimeUnit.SECONDS);
System.out.println("线程 C 收到: " + result);
} catch (InterruptedException | TimeoutException e) {
System.out.println("线程 C 等待超时或被中断");
}
}).start();Exchanger 只设计用于两个线程之间的数据交换。如果多个线程调用 exchange(),不能保证哪两个线程会配对成功,可能导致不可预期的行为。
基本上就这些。Exchanger 使用简单,但在特定协作场景下非常有用,比如双缓冲切换、线程间状态同步等。
以上就是Java中Exchanger类使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号