我想知道是否有人使用java.util.concurrent.Exchanger类。根据java文档,交换器可用于共享一对线程之间的一些数据。以下示例是读取和写入数据以及线程间交互的典型用例。Exchanger Vs CountDownLatch
class FillAndEmpty {
Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
DataBuffer initialEmptyBuffer = ... a made-up type
DataBuffer initialFullBuffer = ...
class FillingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialEmptyBuffer;
try {
while (currentBuffer != null) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ... }
}
}
class EmptyingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialFullBuffer;
try {
while (currentBuffer != null) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ...}
}
}
void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
对于两个CountDownLatch也可以做同样的事情。一个用于写入缓冲区,一个用于在所有读取器线程处理完记录后通知编写器。所以我的问题是
- 什么是交换 理想的使用
- 它有哪些优点和缺点在说的CountDownLatch
据我所知,你在上面得到的是'发生之前'关系的保证,即线程A对交换对象做的所有事情都将被线程B看到,反之亦然。顾名思义,它在线程之间交换对象,在一次调用中处理两个方向。它代表了比倒计时锁存器更专业但更高层次的操作。 – biziclop
谢谢@biziclop。我想我能从中得到的是虽然同样的事情可以通过锁存器或信号量来实现,但是Exhanger对于这种工作是特定的,只要在读写器线程之间共享数据容器不是一个大问题。 – Tatha
@Taffa这是我的至少承诺,但作为一个声明,我不得不说,我从来没有在愤怒中使用过“交换器”。可能很容易出现一些我忽略的重要细节。 – biziclop