java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractQueue<E>
java.util.concurrent.SynchronousQueue<E>
- 类型参数:
-
E- 此队列中保存的元素的类型
- 所有已实现的接口:
-
Serializable,Iterable<E>,Collection<E>,BlockingQueue<E>,Queue<E>
一个阻塞队列,在这个队列中,每个插入操作都必须等待另一个线程的相应删除操作,反之亦然。同步队列没有任何内部容量,甚至没有一个容量。您不能在同步队列上执行
peek操作,因为只有在尝试删除元素时才存在元素;除非另一个线程正在尝试删除元素,否则您无法插入元素(使用任何方法);由于没有要迭代的内容,您无法进行迭代。队列的头部是第一个排队插入线程正在尝试添加到队列的元素;如果没有这样的排队线程,则没有元素可用于删除,poll()将返回null。对于其他Collection方法(例如contains),SynchronousQueue充当空集合。此队列不允许包含null元素。
同步队列类似于CSP和Ada中使用的会合通道。它们非常适合于交接设计,其中在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便将一些信息、事件或任务交给它。
此类支持可选的公平策略,用于对等待的生产者和消费者线程进行排序。默认情况下,此排序不被保证。但是,使用公平性设置为true构造的队列按照FIFO顺序授予线程访问权限。
此类及其迭代器实现了Collection和Iterator接口的所有可选方法。
此类是Java集合框架的成员。
- 自 JDK 版本:
- 1.5
- 参见:
-
Constructor Summary
ConstructorsConstructorDescription创建一个具有非公平访问策略的SynchronousQueue。SynchronousQueue(boolean fair) 创建一个具有指定公平性策略的SynchronousQueue。 -
Method Summary
Modifier and TypeMethodDescriptionvoidclear()什么也不做。boolean总是返回false。booleancontainsAll(Collection<?> c) 除非给定的集合为空,否则返回false。intdrainTo(Collection<? super E> c) 从此队列中删除所有可用元素并将它们添加到给定的集合中。intdrainTo(Collection<? super E> c, int maxElements) 从此队列中最多删除给定数量的可用元素,并将它们添加到给定的集合中。booleanisEmpty()总是返回true。iterator()返回一个空迭代器,其中hasNext始终返回false。boolean如果另一个线程正在等待接收指定的元素,则将指定的元素插入此队列。boolean如果需要,将指定的元素插入此队列,并等待指定的等待时间,直到另一个线程接收它。peek()总是返回null。poll()如果当前有另一个线程正在使元素可用,则检索并删除此队列的头部。如果需要,等待另一个线程将其插入,以检索并删除此队列的头部。void将指定的元素添加到此队列中,如果需要,等待另一个线程接收它。int总是返回零。boolean总是返回false。booleanremoveAll(Collection<?> c) 总是返回false。booleanretainAll(Collection<?> c) 总是返回false。intsize()总是返回零。返回一个空的分割迭代器,其中对trySplit的调用始终返回null。take()如果需要,等待另一个线程将其插入,以检索并删除此队列的头部。Object[]toArray()返回一个长度为零的数组。<T> T[]toArray(T[] a) 将指定数组的第零个元素设置为null(如果数组的长度非零),并返回该数组。toString()总是返回"[]"。Methods declared in class java.util.AbstractQueue
add, addAll, element, removeMethods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods declared in interface java.util.concurrent.BlockingQueue
addMethods declared in interface java.util.Collection
addAll, equals, hashCode, parallelStream, removeIf, stream, toArray
-
Constructor Details
-
SynchronousQueue
public SynchronousQueue()创建一个具有非公平访问策略的SynchronousQueue。 -
SynchronousQueue
public SynchronousQueue(boolean fair) 创建一个具有指定公平性策略的SynchronousQueue。- 参数:
-
fair- 如果为true,则等待线程按FIFO顺序竞争访问;否则顺序是未指定的。
-
-
Method Details
-
put
如果需要,等待另一个线程将其插入,以将指定的元素添加到此队列。- 指定者:
-
put在接口BlockingQueue<E>中 - 参数:
-
e- 要添加的元素 - 抛出:
-
InterruptedException- 如果在等待时被中断 -
NullPointerException- 如果指定的元素为null
-
offer
如果需要,等待另一个线程将其插入,以将指定的元素添加到此队列,并等待指定的等待时间。- 指定者:
-
offer在接口BlockingQueue<E>中 - 参数:
-
e- 要添加的元素 -
timeout- 在unit单位内等待多长时间后放弃 -
unit- 一个TimeUnit,用于解释timeout参数 - 返回:
-
如果成功,则返回
true,如果指定的等待时间在消费者出现之前过去,则返回false - 抛出:
-
InterruptedException- 如果在等待时被中断 -
NullPointerException- 如果指定的元素为null
-
offer
如果另一个线程正在等待接收指定的元素,则将指定的元素插入此队列。- 指定者:
-
offer在接口BlockingQueue<E>中 - 指定者:
-
offer在接口Queue<E>中 - 参数:
-
e- 要添加的元素 - 返回:
-
如果元素已添加到此队列,则返回
true,否则返回false - 抛出:
-
NullPointerException- 如果指定的元素为null
-
take
如果需要,等待另一个线程将其插入,以检索并删除此队列的头部。- 指定者:
-
take在接口BlockingQueue<E>中 - 返回:
- 此队列的头部
- 抛出:
-
InterruptedException- 如果在等待时被中断
-
poll
如果需要,等待另一个线程将其插入,以检索并删除此队列的头部。- 指定者:
-
poll在接口BlockingQueue<E>中 - 参数:
-
timeout- 在unit单位内等待多长时间后放弃 -
unit- 一个TimeUnit,用于解释timeout参数 - 返回:
-
此队列的头部,如果指定的等待时间在元素出现之前过去,则返回
null - 抛出:
-
InterruptedException- 如果在等待时被中断
-
poll
如果另一个线程当前正在使元素可用,则检索并删除此队列的头部。 -
isEmpty
public boolean isEmpty()总是返回true。SynchronousQueue没有内部容量。- 指定由:
-
isEmpty在接口Collection<E> - 覆盖:
-
isEmpty在类AbstractCollection<E> - 返回:
-
true
-
size
public int size()总是返回零。SynchronousQueue没有内部容量。- 指定由:
-
size在接口Collection<E> - 返回:
- 零
-
remainingCapacity
public int remainingCapacity()总是返回零。SynchronousQueue没有内部容量。- 指定由:
-
remainingCapacity在接口BlockingQueue<E> - 返回:
- 零
-
clear
public void clear()什么也不做。SynchronousQueue没有内部容量。- 指定由:
-
clear在接口Collection<E> - 覆盖:
-
clear在类AbstractQueue<E>
-
contains
总是返回false。SynchronousQueue没有内部容量。- 指定由:
-
contains在接口BlockingQueue<E> - 指定由:
-
contains在接口Collection<E> - 覆盖:
-
contains在类AbstractCollection<E> - 参数:
-
o- 元素 - 返回:
-
false
-
remove
总是返回false。SynchronousQueue没有内部容量。- 指定由:
-
remove在接口BlockingQueue<E> - 指定由:
-
remove在接口Collection<E> - 覆盖:
-
remove在类AbstractCollection<E> - 参数:
-
o- 要移除的元素 - 返回:
-
false
-
containsAll
返回false,除非给定的集合为空。SynchronousQueue没有内部容量。- 指定由:
-
containsAll在接口Collection<E> - 覆盖:
-
containsAll在类AbstractCollection<E> - 参数:
-
c- 集合 - 返回:
-
false,除非给定的集合为空 - 参见:
-
removeAll
总是返回false。SynchronousQueue没有内部容量。- 指定由:
-
removeAll在接口Collection<E> - 覆盖:
-
removeAll在类AbstractCollection<E> - 参数:
-
c- 集合 - 返回:
-
false - 参见:
-
retainAll
总是返回false。SynchronousQueue没有内部容量。- 指定由:
-
retainAll在接口Collection<E> - 覆盖:
-
retainAll在类AbstractCollection<E> - 参数:
-
c- 集合 - 返回:
-
false - 参见:
-
peek
总是返回null。SynchronousQueue除非主动等待,否则不会返回元素。 -
iterator
返回一个空的迭代器,其中hasNext总是返回false。- 指定由:
-
iterator在接口Collection<E> - 指定由:
-
iterator在接口Iterable<E> - 指定由:
-
iterator在类AbstractCollection<E> - 返回:
- 一个空的迭代器
-
spliterator
返回一个空的分割迭代器,其中调用trySplit总是返回null。- 指定由:
-
spliterator在接口Collection<E> - 指定由:
-
spliterator在接口Iterable<E> - 返回:
- 一个空的分割迭代器
- 自1.8起:
- 1.8
-
toArray
返回一个长度为零的数组。- 指定由:
-
toArray在接口Collection<E>中 - 覆盖:
-
toArray在类AbstractCollection<E>中 - 返回:
- 长度为零的数组
-
toArray
public <T> T[] toArray(T[] a) 将指定数组的第零个元素设置为null(如果数组长度非零),然后返回它。- 指定由:
-
toArray在接口Collection<E>中 - 覆盖:
-
toArray在类AbstractCollection<E>中 - 类型参数:
-
T- 包含集合的数组的组件类型 - 参数:
-
a- 数组 - 返回:
- 指定的数组
- 抛出:
-
NullPointerException- 如果指定的数组为null
-
toString
总是返回"[]"。- 覆盖:
-
toString在类AbstractCollection<E>中 - 返回:
-
"[]"
-
drainTo
从接口复制的描述:BlockingQueue从此队列中移除所有可用元素并将它们添加到给定的集合中。此操作可能比重复轮询此队列更有效。在尝试将元素添加到集合c时遇到失败可能导致在抛出相关异常时元素既不在集合中,也不在队列中,或同时存在于两者中。尝试将队列排空到自身会导致IllegalArgumentException。此外,如果在操作进行中修改了指定的集合,则此操作的行为是未定义的。- 指定由:
-
drainTo在接口BlockingQueue<E>中 - 参数:
-
c- 转移元素到的集合 - 返回:
- 转移的元素数量
- 抛出:
-
UnsupportedOperationException- 如果指定集合不支持添加元素 -
ClassCastException- 如果此队列的元素类别阻止将其添加到指定集合中 -
NullPointerException- 如果指定的集合为null -
IllegalArgumentException- 如果指定的集合为此队列,或者此队列的某个元素属性阻止将其添加到指定集合中
-
drainTo
从接口复制的描述:BlockingQueue从此队列中最多移除给定数量的可用元素,并将它们添加到给定的集合中。在尝试将元素添加到集合c时遇到失败可能导致在抛出相关异常时元素既不在集合中,也不在队列中,或同时存在于两者中。尝试将队列排空到自身会导致IllegalArgumentException。此外,如果在操作进行中修改了指定的集合,则此操作的行为是未定义的。- 指定由:
-
drainTo在接口BlockingQueue<E>中 - 参数:
-
c- 转移元素到的集合 -
maxElements- 要转移的最大元素数量 - 返回:
- 转移的元素数量
- 抛出:
-
UnsupportedOperationException- 如果指定集合不支持添加元素 -
ClassCastException- 如果此队列的元素类别阻止将其添加到指定集合中 -
NullPointerException- 如果指定的集合为null -
IllegalArgumentException- 如果指定的集合为此队列,或者此队列的某个元素属性阻止将其添加到指定集合中
-