- java.lang.Object
-
- java.util.concurrent.Exchanger<V>
-
- 参数类型
-
V
- 可以交换的对象类型
public class Exchanger<V> extends Object
线程可以在对中交换元素的同步点。 每个线程在进入exchange
方法时呈现一些对象,与伙伴线程匹配,并在返回时接收其伙伴的对象。 可以将交换器视为SynchronousQueue
的双向形式。 交换器可能在遗传算法和管道设计等应用中很有用。示例用法:以下是使用
Exchanger
在线程之间交换缓冲区的类的亮点,以便填充缓冲区的线程在需要时获得一个刚刚清空的线程,将填充的线程切换到清空缓冲区的线程。class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger<>(); 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(); } }
内存一致性效果:对于每对线程,其经成功交换对象
Exchanger
,现有的行动exchange()
中的每个线程happen-before那些从相应的返回后续exchange()
中的其他线程。- 从以下版本开始:
- 1.5
-
-
方法详细信息
-
exchange
public V exchange(V x) throws InterruptedException
等待另一个线程到达此交换点(除非当前线程是interrupted ),然后将给定对象传递给它,接收其对象作为回报。如果另一个线程已经在交换点等待,那么它将被恢复以进行线程调度,并接收当前线程传入的对象。 当前线程立即返回,接收由该另一个线程传递给交换的对象。
如果没有其他线程在交换机上等待,则当前线程被禁用以进行线程调度,并且在发生以下两种情况之一之前处于休眠状态:
- 其他一些线程进入交易所; 要么
- 其他一些线程interrupts当前线程。
如果当前线程:
- 在进入此方法时设置其中断状态; 要么
- 在等待交换时是interrupted ,
InterruptedException
并清除当前线程的中断状态。- 参数
-
x
- 要交换的对象 - 结果
- 另一个线程提供的对象
- 异常
-
InterruptedException
- 如果当前线程在等待时被中断
-
exchange
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
等待另一个线程到达此交换点(除非当前线程是interrupted或指定的等待时间过去),然后将给定对象传递给它,接收其对象作为回报。如果另一个线程已经在交换点等待,那么它将被恢复以进行线程调度,并接收当前线程传入的对象。 当前线程立即返回,接收由该另一个线程传递给交换的对象。
如果没有其他线程在交换机上等待,则当前线程被禁用以进行线程调度,并且在发生以下三种情况之一之前处于休眠状态:
- 其他一些线程进入交易所; 要么
- 其他一些线程interrupts当前线程; 要么
- 指定的等待时间过去了。
如果当前线程:
- 在进入此方法时设置其中断状态; 要么
- 在等待交换时是interrupted
InterruptedException
并清除当前线程的中断状态。如果指定的等待时间过去,则抛出
TimeoutException
。 如果时间小于或等于零,则该方法将不会等待。- 参数
-
x
- 要交换的对象 -
timeout
- 等待的最长时间 -
unit
-timeout
参数的时间单位 - 结果
- 另一个线程提供的对象
- 异常
-
InterruptedException
- 如果当前线程在等待时被中断 -
TimeoutException
- 如果在另一个线程进入交换之前经过了指定的等待时间
-
-