- 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>
public class SynchronousQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, Serializable
blocking queue ,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。 同步队列没有任何内部容量,甚至没有容量。 您不能在同步队列中使用peek
,因为只有在您尝试删除它时才会出现该元素; 你不能插入一个元素(使用任何方法),除非另一个线程试图删除它; 你不能迭代,因为没有什么可以迭代。 队列的头部是第一个排队插入线程试图添加到队列的元素; 如果没有这样排队的线程,那么没有元素可供删除,poll()
将返回null
。 出于其他Collection
方法的目的(例如contains
),SynchronousQueue
充当空集合。 此队列不允许null
元素。同步队列类似于CSP和Ada中使用的集合点通道。 它们非常适用于切换设计,其中在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便将其传递给某些信息,事件或任务。
此类支持用于排序等待生产者和消费者线程的可选公平策略。 默认情况下,不保证此顺序。 但是,使用公平性设置为
true
构造的队列以FIFO顺序授予线程访问权限。该类及其迭代器实现了
Collection
和Iterator
接口的所有可选方法。此类是Java Collections Framework的成员。
- 从以下版本开始:
- 1.5
- 另请参见:
- Serialized Form
-
-
构造方法摘要
构造方法 构造器 描述 SynchronousQueue()
创建具有SynchronousQueue
公平访问策略的SynchronousQueue。SynchronousQueue(boolean fair)
使用指定的公平政策创建SynchronousQueue
。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 void
clear()
什么也没做。boolean
contains(Object o)
始终返回false
。boolean
containsAll(Collection<?> c)
除非给定集合为空,否则返回false
。int
drainTo(Collection<? super E> c)
从此队列中删除所有可用元素,并将它们添加到给定集合中。int
drainTo(Collection<? super E> c, int maxElements)
从该队列中删除最多给定数量的可用元素,并将它们添加到给定集合中。boolean
isEmpty()
始终返回true
。Iterator<E>
iterator()
返回一个空迭代器,其中hasNext
始终返回false
。boolean
offer(E e)
如果另一个线程正在等待接收它,则将指定的元素插入此队列。boolean
offer(E e, long timeout, TimeUnit unit)
将指定的元素插入此队列,在必要时等待指定的等待时间,以便另一个线程接收它。E
peek()
始终返回null
。E
poll()
如果另一个线程当前正在使元素可用,则检索并移除此队列的头部。E
poll(long timeout, TimeUnit unit)
检索并删除此队列的头部,在必要时等待指定的等待时间,以便另一个线程插入它。void
put(E e)
将指定的元素添加到此队列,等待另一个线程接收它。int
remainingCapacity()
始终返回零。boolean
remove(Object o)
始终返回false
。boolean
removeAll(Collection<?> c)
始终返回false
。boolean
retainAll(Collection<?> c)
始终返回false
。int
size()
始终返回零。Spliterator<E>
spliterator()
返回一个空的spliterator,其中对trySplit
的调用始终返回null
。E
take()
检索并删除此队列的头部,等待另一个线程插入它。Object[]
toArray()
返回零长度数组。<T> T[]
toArray(T[] a)
将指定数组的第0个元素设置为null
(如果数组长度为非零)并返回它。String
toString()
始终返回"[]"
。-
声明方法的类 java.util.AbstractQueue
add, addAll, element, remove
-
声明方法的类 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
声明方法的接口 java.util.concurrent.BlockingQueue
add
-
声明方法的接口 java.util.Collection
addAll, equals, hashCode, parallelStream, removeIf, stream, toArray
-
-
-
-
方法详细信息
-
put
public void put(E e) throws InterruptedException
将指定的元素添加到此队列,等待另一个线程接收它。- Specified by:
-
put
在界面BlockingQueue<E>
- 参数
-
e
- 要添加的元素 - 异常
-
InterruptedException
- 如果在等待时中断 -
NullPointerException
- 如果指定的元素为null
-
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
-
take
public E take() throws InterruptedException
检索并删除此队列的头部,等待另一个线程插入它。- Specified by:
-
take
在界面BlockingQueue<E>
- 结果
- 这个队列的头
- 异常
-
InterruptedException
- 如果在等待时中断
-
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()
如果另一个线程当前正在使元素可用,则检索并移除此队列的头部。
-
isEmpty
public boolean isEmpty()
始终返回true
。SynchronousQueue
没有内部容量。- Specified by:
-
isEmpty
在界面Collection<E>
- 重写:
-
isEmpty
在类AbstractCollection<E>
- 结果
-
true
-
size
public int size()
始终返回零。SynchronousQueue
没有内部容量。- Specified by:
-
size
在界面Collection<E>
- 结果
- 零
-
remainingCapacity
public int remainingCapacity()
始终返回零。SynchronousQueue
没有内部容量。- Specified by:
-
remainingCapacity
in interfaceBlockingQueue<E>
- 结果
- 零
-
clear
public void clear()
什么也没做。SynchronousQueue
没有内部容量。- Specified by:
-
clear
在界面Collection<E>
- 重写:
-
clear
在类AbstractQueue<E>
-
contains
public boolean contains(Object o)
始终返回false
。SynchronousQueue
没有内部容量。- Specified by:
-
contains
在界面BlockingQueue<E>
- Specified by:
-
contains
在界面Collection<E>
- 重写:
-
contains
在类AbstractCollection<E>
- 参数
-
o
- 元素 - 结果
-
false
-
remove
public boolean remove(Object o)
始终返回false
。SynchronousQueue
没有内部容量。- Specified by:
-
remove
在界面BlockingQueue<E>
- Specified by:
-
remove
在界面Collection<E>
- 重写:
-
remove
在类AbstractCollection<E>
- 参数
-
o
- 要删除的元素 - 结果
-
false
-
containsAll
public boolean containsAll(Collection<?> c)
除非给定集合为空,否则返回false
。SynchronousQueue
没有内部容量。- Specified by:
-
containsAll
在界面Collection<E>
- 重写:
-
containsAll
在课堂上AbstractCollection<E>
- 参数
-
c
- 该集合 - 结果
-
false
除非给定的集合是空的 - 另请参见:
-
AbstractCollection.contains(Object)
-
removeAll
public boolean removeAll(Collection<?> c)
始终返回false
。SynchronousQueue
没有内部容量。- Specified by:
-
removeAll
在接口Collection<E>
- 重写:
-
removeAll
在类AbstractCollection<E>
- 参数
-
c
- 该系列 - 结果
-
false
- 另请参见:
-
AbstractCollection.remove(Object)
,AbstractCollection.contains(Object)
-
retainAll
public boolean retainAll(Collection<?> c)
始终返回false
。SynchronousQueue
没有内部容量。- Specified by:
-
retainAll
在界面Collection<E>
- 重写:
-
retainAll
在类AbstractCollection<E>
- 参数
-
c
- 该集合 - 结果
-
false
- 另请参见:
-
AbstractCollection.remove(Object)
,AbstractCollection.contains(Object)
-
peek
public E peek()
始终返回null
。 除非主动等待,否则SynchronousQueue
不会返回元素。
-
iterator
public Iterator<E> iterator()
返回一个空迭代器,其中hasNext
始终返回false
。- Specified by:
-
iterator
在接口Collection<E>
- Specified by:
-
iterator
在界面Iterable<E>
- Specified by:
-
iterator
在类AbstractCollection<E>
- 结果
- 一个空的迭代器
-
spliterator
public Spliterator<E> spliterator()
返回一个空的spliterator,其中对trySplit
的调用始终返回null
。- Specified by:
-
spliterator
在界面Collection<E>
- Specified by:
-
spliterator
在界面Iterable<E>
- 结果
- 一个空的分裂者
- 从以下版本开始:
- 1.8
-
toArray
public Object[] toArray()
返回零长度数组。- Specified by:
-
toArray
在界面Collection<E>
- 重写:
-
toArray
类AbstractCollection<E>
- 结果
- 零长度数组
-
toArray
public <T> T[] toArray(T[] a)
将指定数组的第0个元素设置为null
(如果数组长度为非零)并返回它。- Specified by:
-
toArray
在界面Collection<E>
- 重写:
-
toArray
在类AbstractCollection<E>
- 参数类型
-
T
- 要包含集合的数组的组件类型 - 参数
-
a
- 数组 - 结果
- 指定的数组
- 异常
-
NullPointerException
- 如果指定的数组为null
-
toString
public String toString()
始终返回"[]"
。- 重写:
-
toString
在类AbstractCollection<E>
- 结果
-
"[]"
-
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
- 如果指定的集合是此队列,或此队列的某个元素的某些属性阻止将其添加到指定的集合
-
-