模块  java.base
软件包  java.util.concurrent

Class SynchronousQueue<E>

  • 参数类型
    E - 此队列中保留的元素类型
    实现的所有接口
    SerializableIterable<E>Collection<E>BlockingQueue<E>Queue<E>

    public class SynchronousQueue<E>extends AbstractQueue<E>implements BlockingQueue<E>, Serializable
    blocking queue ,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。 同步队列没有任何内部容量,甚至没有容量。 您不能在同步队列中使用peek ,因为只有在您尝试删除它时才会出现该元素; 你不能插入一个元素(使用任何方法),除非另一个线程试图删除它; 你不能迭代,因为没有什么可以迭代。 队列的头部是第一个排队插入线程试图添加到队列的元素; 如果没有这样排队的线程,那么没有元素可供删除, poll()将返回null 出于其他Collection方法的目的(例如contains ), SynchronousQueue充当空集合。 此队列不允许null元素。

    同步队列类似于CSP和Ada中使用的集合点通道。 它们非常适用于切换设计,其中在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便将其传递给某些信息,事件或任务。

    此类支持用于排序等待生产者和消费者线程的可选公平策略。 默认情况下,不保证此顺序。 但是,使用公平性设置为true构造的队列以FIFO顺序授予线程访问权限。

    该类及其迭代器实现了CollectionIterator接口的所有可选方法。

    此类是Java Collections Framework的成员。

    从以下版本开始:
    1.5
    另请参见:
    Serialized Form
    • 构造方法详细信息

      • SynchronousQueue

        public SynchronousQueue()
        使用不公平访问策略创建 SynchronousQueue
      • SynchronousQueue

        public SynchronousQueue​(boolean fair)
        使用指定的公平政策创建 SynchronousQueue
        参数
        fair - 如果为true,则等待线程以FIFO顺序竞争访问; 否则订单未指定。
    • 方法详细信息

      • offer

        public boolean offer​(E e,                     long timeout,                     TimeUnit unit)              throws InterruptedException
        将指定的元素插入此队列,在必要时等待指定的等待时间,以便另一个线程接收它。
        Specified by:
        offer在界面 BlockingQueue<E>
        参数
        e - 要添加的元素
        timeout - 放弃前等待多长时间,单位为 unit
        unit -一个 TimeUnit确定如何解释 timeout参数
        结果
        true如果成功的话,或 false如果指定的等待时间会出现一个消费之前经过
        异常
        InterruptedException - 等待时中断
        NullPointerException - 如果指定的元素为null
      • offer

        public boolean offer​(E e)
        如果另一个线程正在等待接收它,则将指定的元素插入此队列。
        Specified by:
        offer在界面 BlockingQueue<E>
        Specified by:
        offer在界面 Queue<E>
        参数
        e - 要添加的元素
        结果
        true如果元素已添加到此队列, false
        异常
        NullPointerException - 如果指定的元素为null
      • poll

        public E poll​(long timeout,              TimeUnit unit)       throws InterruptedException
        检索并删除此队列的头部,在必要时等待指定的等待时间,以便另一个线程插入它。
        Specified by:
        poll在界面 BlockingQueue<E>
        参数
        timeout - 放弃前等待多长时间,单位为 unit
        unit -一个 TimeUnit确定如何解释 timeout参数
        结果
        此队列的头部,或 null如果在元素存在之前经过了指定的等待时间
        异常
        InterruptedException - 如果在等待时中断
      • poll

        public E poll()
        如果另一个线程当前正在使元素可用,则检索并移除此队列的头部。
        Specified by:
        poll在界面 Queue<E>
        结果
        此队列的头部,如果没有可用元素, null
      • size

        public int size()
        始终返回零。 SynchronousQueue没有内部容量。
        Specified by:
        size在界面 Collection<E>
        结果
      • remainingCapacity

        public int remainingCapacity()
        始终返回零。 SynchronousQueue没有内部容量。
        Specified by:
        remainingCapacity in interface BlockingQueue<E>
        结果
      • peek

        public E peek()
        始终返回null 除非主动等待,否则SynchronousQueue不会返回元素。
        Specified by:
        peek在界面 Queue<E>
        结果
        null
      • toArray

        public <T> T[] toArray​(T[] a)
        将指定数组的第0个元素设置为 null (如果数组长度为非零)并返回它。
        Specified by:
        toArray在界面 Collection<E>
        重写:
        toArray在类 AbstractCollection<E>
        参数类型
        T - 要包含集合的数组的组件类型
        参数
        a - 数组
        结果
        指定的数组
        异常
        NullPointerException - 如果指定的数组为null
      • drainTo

        public int drainTo​(Collection<? super E> c)
        从界面复制的说明: BlockingQueue
        从此队列中删除所有可用元素,并将它们添加到给定集合中。 此操作可能比重复轮询此队列更有效。 尝试向集合c添加元素时遇到的故障可能导致在抛出关联的异常时元素既不在集合中,也不在集合中。 尝试将队列排入自身会导致IllegalArgumentException 此外,如果在操作正在进行时修改了指定的集合,则此操作的行为是不确定的。
        Specified by:
        drainTo在界面 BlockingQueue<E>
        参数
        c - 将元素转换为的集合
        结果
        转移的元素数量
        异常
        UnsupportedOperationException - 如果指定的集合不支持添加元素
        ClassCastException - 如果此队列的元素的类阻止将其添加到指定的集合中
        NullPointerException - 如果指定的集合为null
        IllegalArgumentException - 如果指定的集合是此队列,或此队列的某个元素的某些属性阻止将其添加到指定的集合
      • drainTo

        public int drainTo​(Collection<? super E> c,                   int maxElements)
        从界面复制的说明: BlockingQueue
        从该队列中删除最多给定数量的可用元素,并将它们添加到给定集合中。 尝试向集合c添加元素时遇到的故障可能导致在抛出关联的异常时元素既不在集合中,也不在集合中。 尝试将队列排入自身会导致IllegalArgumentException 此外,如果在操作正在进行时修改了指定的集合,则此操作的行为是不确定的。
        Specified by:
        drainTo在界面 BlockingQueue<E>
        参数
        c - 将元素传输到的集合
        maxElements - 要传输的最大元素数
        结果
        转移的元素数量
        异常
        UnsupportedOperationException - 如果指定的集合不支持添加元素
        ClassCastException - 如果此队列的元素的类阻止将其添加到指定的集合中
        NullPointerException - 如果指定的集合为null
        IllegalArgumentException - 如果指定的集合是此队列,或此队列的某个元素的某些属性阻止将其添加到指定的集合