Module  java.base
软件包  java.util.concurrent

Class 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
    • 构造方法详细信息

      • Exchanger

        public Exchanger​()
        创建一个新的交换器。
    • 方法详细信息

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