java.lang.Object
java.util.concurrent.Exchanger<V>
- 类型参数:
-
V
- 可以交换的对象类型
线程可以在此同步点配对并交换成对中的元素。每个线程在进入
exchange
方法时呈现某个对象,与伙伴线程匹配,并在返回时接收其伙伴的对象。Exchanger可以被视为SynchronousQueue
的双向形式。Exchanger在遗传算法和管道设计等应用中可能很有用。
示例用法: 这里是一个使用Exchanger
在线程之间交换缓冲区的类的要点,以便填充缓冲区的线程在需要时获得一个新鲜清空的缓冲区,并将填充的缓冲区交给清空缓冲区的线程。
class FillAndEmpty {
Exchanger<DataBuffer> exchanger = new Exchanger<>();
DataBuffer initialEmptyBuffer = ...; // 一个虚构的类型
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) { ... 处理 ...}
}
}
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) { ... 处理 ...}
}
}
void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
内存一致性效果: 对于通过Exchanger
成功交换对象的每对线程,每个线程中exchange()
之前的操作在另一个线程中从相应的exchange()
返回后发生之前。
- 自 JDK 1.5 起:
- 1.5
-
Constructor Summary
-
Method Summary
-
Constructor Details
-
Exchanger
public Exchanger()创建一个新的Exchanger。
-
-
Method Details
-
exchange
等待另一个线程到达此交换点(除非当前线程被中断),然后将给定对象传输给它,并接收其返回的对象。如果另一个线程已经在交换点等待,则为了线程调度目的恢复它,并接收当前线程传入的对象。当前线程立即返回,接收由另一个线程传递给交换的对象。
如果没有其他线程在交换点等待,则当前线程为了线程调度目的被禁用,并处于休眠状态,直到发生以下两种情况之一:
- 其他线程进入交换; 或
- 其他线程中断当前线程。
如果当前线程:
- 在进入此方法时设置了中断状态; 或
- 在等待交换时被中断,
InterruptedException
,并清除当前线程的中断状态。- 参数:
-
x
- 要交换的对象 - 返回:
- 其他线程提供的对象
- 抛出:
-
InterruptedException
- 如果当前线程在等待时被中断
-
exchange
等待另一个线程到达此交换点(除非当前线程被中断或指定的等待时间过去),然后将给定对象传输给它,并接收其返回的对象。如果另一个线程已经在交换点等待,则为了线程调度目的恢复它,并接收当前线程传入的对象。当前线程立即返回,接收由另一个线程传递给交换的对象。
如果没有其他线程在交换点等待,则当前线程为了线程调度目的被禁用,并处于休眠状态,直到发生以下三种情况之一:
- 其他线程进入交换; 或
- 其他线程中断当前线程; 或
- 指定的等待时间过去。
如果当前线程:
- 在进入此方法时设置了中断状态; 或
- 在等待交换时被中断,
InterruptedException
,并清除当前线程的中断状态。如果指定的等待时间过去,则抛出
TimeoutException
。如果时间小于或等于零,则该方法将根本不等待。- 参数:
-
x
- 要交换的对象 -
timeout
- 最大等待时间 -
unit
-timeout
参数的时间单位 - 返回:
- 其他线程提供的对象
- 抛出:
-
InterruptedException
- 如果当前线程在等待时被中断 -
TimeoutException
- 如果在另一个线程进入交换之前指定的等待时间过去
-