V
- 可以交换的对象的类型
public class Exchanger<V> extends Object
exchange
方法时提供一些对象,与合作者线程匹配,并在返回时接收其合作伙伴的对象。
交换器可以被视为一个的双向形式SynchronousQueue
。
交换器在诸如遗传算法和管道设计的应用中可能是有用的。
示例用法:以下是使用Exchanger
在线程之间交换缓冲区的类的Exchanger
,以便填充缓冲区的线程在需要时将其清空,将已填充的线程移交给清空缓冲区的线程。
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(); } }
内存一致性效果:对于每对线程,其经成功交换对象Exchanger
,现有的行动exchange()
中的每个线程happen-before那些从相应的返回后续exchange()
中的其他线程。
Constructor and Description |
---|
Exchanger()
创建一个新的交换器。
|
public V exchange(V x) throws InterruptedException
如果另一个线程已经在交换点处等待,那么它将恢复为线程调度目的,并接收当前线程传入的对象。 当前线程立即返回,接收通过该另一线程传递到交换机的对象。
如果没有其他线程已经在交换机上等待,那么当前线程被禁用以进行线程调度,并且休眠,直到发生两件事情之一:
如果当前线程:
InterruptedException
被关上,当前线程的中断状态被清除。
x
- 交换对象
InterruptedException
- 如果当前线程在等待时中断
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
如果另一个线程已经在交换点处等待,那么它将恢复为线程调度目的,并接收当前线程传入的对象。 当前线程立即返回,接收通过该另一线程传递到交换机的对象。
如果没有其他线程已经在交换机上等待,那么当前线程被禁用以进行线程调度,并且处于休眠状态,直至发生三件事情之一:
如果当前线程:
InterruptedException
被关上,当前线程的中断状态被清除。
如果指定的等待时间过去,则抛出TimeoutException
。 如果时间小于或等于零,该方法根本不会等待。
x
- 交换对象
timeout
- 等待的最长时间
unit
-
timeout
参数的时间单位
InterruptedException
- 如果当前线程在等待时中断
TimeoutException
- 如果在另一个线程进入交换机之前经过了指定的等待时间