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