- 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
- 如果在另一个线程进入交换机之前经过了指定的等待时间
-
-