Module java.base

Class Exchanger<V>

java.lang.Object
java.util.concurrent.Exchanger<V>
类型参数:
V - 可以交换的对象类型

public class Exchanger<V> extends Object
线程可以在此同步点配对并交换成对中的元素。每个线程在进入exchange方法时呈现某个对象,与伙伴线程匹配,并在返回时接收其伙伴的对象。Exchanger可以被视为SynchronousQueue的双向形式。Exchanger在遗传算法和管道设计等应用中可能很有用。

示例用法: 这里是一个使用Exchanger在线程之间交换缓冲区的类的要点,以便填充缓冲区的线程在需要时获得一个新鲜清空的缓冲区,并将填充的缓冲区交给清空缓冲区的线程。

 
 class FillAndEmpty {
   Exchanger<DataBuffer> exchanger = new Exchanger<>();
   DataBuffer initialEmptyBuffer = ...; // 一个虚构的类型
   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) { ... 处理 ...}
     }
   }

   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) { ... 处理 ...}
     }
   }

   void start() {
     new Thread(new FillingLoop()).start();
     new Thread(new EmptyingLoop()).start();
   }
 }

内存一致性效果: 对于通过Exchanger成功交换对象的每对线程,每个线程中exchange()之前的操作在另一个线程中从相应的exchange()返回后发生之前。

自 JDK 1.5 起:
1.5
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个新的Exchanger。
  • Method Summary

    Modifier and Type
    Method
    Description
    V
    exchange(V x)
    等待另一个线程到达此交换点(除非当前线程被中断),然后将给定对象传输给它,并接收其返回的对象。
    V
    exchange(V x, long timeout, TimeUnit unit)
    等待另一个线程到达此交换点(除非当前线程被中断或指定的等待时间过去),然后将给定对象传输给它,并接收其返回的对象。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • Exchanger

      public Exchanger()
      创建一个新的Exchanger。
  • Method Details

    • exchange

      public V exchange(V x) throws InterruptedException
      等待另一个线程到达此交换点(除非当前线程被中断),然后将给定对象传输给它,并接收其返回的对象。

      如果另一个线程已经在交换点等待,则为了线程调度目的恢复它,并接收当前线程传入的对象。当前线程立即返回,接收由另一个线程传递给交换的对象。

      如果没有其他线程在交换点等待,则当前线程为了线程调度目的被禁用,并处于休眠状态,直到发生以下两种情况之一:

      • 其他线程进入交换; 或
      • 其他线程中断当前线程。

      如果当前线程:

      • 在进入此方法时设置了中断状态; 或
      • 在等待交换时被中断,
      则抛出InterruptedException,并清除当前线程的中断状态。
      参数:
      x - 要交换的对象
      返回:
      其他线程提供的对象
      抛出:
      InterruptedException - 如果当前线程在等待时被中断
    • exchange

      public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
      等待另一个线程到达此交换点(除非当前线程被中断或指定的等待时间过去),然后将给定对象传输给它,并接收其返回的对象。

      如果另一个线程已经在交换点等待,则为了线程调度目的恢复它,并接收当前线程传入的对象。当前线程立即返回,接收由另一个线程传递给交换的对象。

      如果没有其他线程在交换点等待,则当前线程为了线程调度目的被禁用,并处于休眠状态,直到发生以下三种情况之一:

      • 其他线程进入交换; 或
      • 其他线程中断当前线程; 或
      • 指定的等待时间过去。

      如果当前线程:

      • 在进入此方法时设置了中断状态; 或
      • 在等待交换时被中断,
      则抛出InterruptedException,并清除当前线程的中断状态。

      如果指定的等待时间过去,则抛出TimeoutException。如果时间小于或等于零,则该方法将根本不等待。

      参数:
      x - 要交换的对象
      timeout - 最大等待时间
      unit - timeout参数的时间单位
      返回:
      其他线程提供的对象
      抛出:
      InterruptedException - 如果当前线程在等待时被中断
      TimeoutException - 如果在另一个线程进入交换之前指定的等待时间过去