public class MpscBlockingConsumerArrayQueue<E> extends java.util.AbstractQueue<E> implements MessagePassingQueue<E>, QueueProgressIndicators, java.util.concurrent.BlockingQueue<E>
BlockingQueue
on the consumer side only on top
of the mechanics described in BaseMpscLinkedArrayQueue
, but with the reservation bit used for blocking rather
than resizing in this instance.MessagePassingQueue.Consumer<T>, MessagePassingQueue.ExitCondition, MessagePassingQueue.Supplier<T>, MessagePassingQueue.WaitStrategy
限定符和类型 | 字段和说明 |
---|---|
protected E[] |
consumerBuffer |
protected long |
consumerMask |
protected E[] |
producerBuffer |
protected long |
producerMask |
UNBOUNDED_CAPACITY
构造器和说明 |
---|
MpscBlockingConsumerArrayQueue(int capacity) |
限定符和类型 | 方法和说明 |
---|---|
int |
capacity() |
long |
currentConsumerIndex()
This method has no concurrent visibility semantics.
|
long |
currentProducerIndex()
This method has no concurrent visibility semantics.
|
int |
drain(MessagePassingQueue.Consumer<E> c)
Remove all available item from the queue and hand to consume.
|
int |
drain(MessagePassingQueue.Consumer<E> c,
int limit)
Remove up to limit elements from the queue and hand to consume.
|
void |
drain(MessagePassingQueue.Consumer<E> c,
MessagePassingQueue.WaitStrategy w,
MessagePassingQueue.ExitCondition exit)
Remove elements from the queue and hand to consume forever.
|
int |
drainTo(java.util.Collection<? super E> c) |
int |
drainTo(java.util.Collection<? super E> c,
int maxElements) |
int |
fill(MessagePassingQueue.Supplier<E> s)
Stuff the queue with elements from the supplier.
|
int |
fill(MessagePassingQueue.Supplier<E> s,
int limit)
Stuff the queue with up to limit elements from the supplier.
|
void |
fill(MessagePassingQueue.Supplier<E> s,
MessagePassingQueue.WaitStrategy wait,
MessagePassingQueue.ExitCondition exit)
Stuff the queue with elements from the supplier forever.
|
boolean |
isEmpty()
This method's accuracy is subject to concurrent modifications happening as the observation is carried
out.
|
java.util.Iterator<E> |
iterator() |
long |
lvConsumerIndex() |
long |
lvProducerIndex() |
boolean |
offer(E e)
Called from a producer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.offer(Object) interface. |
boolean |
offer(E e,
long timeout,
java.util.concurrent.TimeUnit unit) |
E |
peek()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.peek() interface. |
E |
poll()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.poll() interface. |
E |
poll(long timeout,
java.util.concurrent.TimeUnit unit)
This implementation is correct for single consumer thread use only.
|
void |
put(E e) |
boolean |
relaxedOffer(E e)
Called from a producer thread subject to the restrictions appropriate to the implementation.
|
E |
relaxedPeek()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
E |
relaxedPoll()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
int |
remainingCapacity() |
int |
size()
This method's accuracy is subject to concurrent modifications happening as the size is estimated and as
such is a best effort rather than absolute value.
|
E |
take()
This implementation is correct for single consumer thread use only.
|
java.lang.String |
toString() |
contains, containsAll, remove, removeAll, retainAll, toArray, toArray
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
clear
protected final long consumerMask
protected final E[] consumerBuffer
protected final long producerMask
protected final E[] producerBuffer
public final java.util.Iterator<E> iterator()
public final int size()
MessagePassingQueue
size
在接口中 MessagePassingQueue<E>
size
在接口中 java.util.Collection<E>
size
在类中 java.util.AbstractCollection<E>
Integer.MAX_VALUE
but less or equals to
capacity (if bounded).public final boolean isEmpty()
MessagePassingQueue
isEmpty
在接口中 MessagePassingQueue<E>
isEmpty
在接口中 java.util.Collection<E>
isEmpty
在类中 java.util.AbstractCollection<E>
public java.lang.String toString()
toString
在类中 java.util.AbstractCollection<E>
public boolean offer(E e)
MessagePassingQueue
Queue.offer(Object)
interface.offer
在接口中 MessagePassingQueue<E>
offer
在接口中 java.util.concurrent.BlockingQueue<E>
offer
在接口中 java.util.Queue<E>
e
- not null
, will throw NPE if it ispublic void put(E e) throws java.lang.InterruptedException
put
在接口中 java.util.concurrent.BlockingQueue<E>
java.lang.InterruptedException
public boolean offer(E e, long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException
offer
在接口中 java.util.concurrent.BlockingQueue<E>
java.lang.InterruptedException
public E take() throws java.lang.InterruptedException
This implementation is correct for single consumer thread use only.
take
在接口中 java.util.concurrent.BlockingQueue<E>
java.lang.InterruptedException
public E poll(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException
This implementation is correct for single consumer thread use only.
poll
在接口中 java.util.concurrent.BlockingQueue<E>
java.lang.InterruptedException
public int remainingCapacity()
remainingCapacity
在接口中 java.util.concurrent.BlockingQueue<E>
public int drainTo(java.util.Collection<? super E> c)
drainTo
在接口中 java.util.concurrent.BlockingQueue<E>
public int drainTo(java.util.Collection<? super E> c, int maxElements)
drainTo
在接口中 java.util.concurrent.BlockingQueue<E>
public E poll()
Queue.poll()
interface.
This implementation is correct for single consumer thread use only.
poll
在接口中 MessagePassingQueue<E>
poll
在接口中 java.util.Queue<E>
null
iff emptypublic E peek()
Queue.peek()
interface.
This implementation is correct for single consumer thread use only.
peek
在接口中 MessagePassingQueue<E>
peek
在接口中 java.util.Queue<E>
null
iff emptypublic long currentProducerIndex()
QueueProgressIndicators
currentProducerIndex
在接口中 QueueProgressIndicators
public long currentConsumerIndex()
QueueProgressIndicators
currentConsumerIndex
在接口中 QueueProgressIndicators
public int capacity()
capacity
在接口中 MessagePassingQueue<E>
MessagePassingQueue.UNBOUNDED_CAPACITY
if not boundedpublic boolean relaxedOffer(E e)
MessagePassingQueue
Queue.offer(Object)
this method may return false without the queue being full.relaxedOffer
在接口中 MessagePassingQueue<E>
e
- not null
, will throw NPE if it ispublic E relaxedPoll()
MessagePassingQueue
Queue.poll()
this method may return null
without the queue being empty.relaxedPoll
在接口中 MessagePassingQueue<E>
null
if unable to pollpublic E relaxedPeek()
MessagePassingQueue
Queue.peek()
this method may return null
without the queue being empty.relaxedPeek
在接口中 MessagePassingQueue<E>
null
if unable to peekpublic int fill(MessagePassingQueue.Supplier<E> s, int limit)
MessagePassingQueue
for(int i=0; i < limit && relaxedOffer(s.get()); i++);
There's no strong commitment to the queue being full at the end of a fill. Called from a producer
thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get()
make sure you have read
and understood these before using this method.
fill
在接口中 MessagePassingQueue<E>
public int fill(MessagePassingQueue.Supplier<E> s)
MessagePassingQueue
while(relaxedOffer(s.get());There's no strong commitment to the queue being full at the end of a fill. Called from a producer thread subject to the restrictions appropriate to the implementation.
Unbounded queues will fill up the queue with a fixed amount rather than fill up to oblivion.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get()
make sure you have read
and understood these before using this method.
fill
在接口中 MessagePassingQueue<E>
public void fill(MessagePassingQueue.Supplier<E> s, MessagePassingQueue.WaitStrategy wait, MessagePassingQueue.ExitCondition exit)
MessagePassingQueue
int idleCounter = 0;
while (exit.keepRunning()) {
E e = s.get();
while (!relaxedOffer(e)) {
idleCounter = wait.idle(idleCounter);
continue;
}
idleCounter = 0;
}
Called from a producer thread subject to the restrictions appropriate to the implementation. The main difference
being that implementors MUST assure room in the queue is available BEFORE calling MessagePassingQueue.Supplier.get()
.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get()
make sure you have read
and understood these before using this method.
fill
在接口中 MessagePassingQueue<E>
public int drain(MessagePassingQueue.Consumer<E> c)
MessagePassingQueue
M m; while((m = relaxedPoll()) != null){ c.accept(m); }There's no strong commitment to the queue being empty at the end of a drain. Called from a consumer thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Consumer.accept(T)
make sure you have read
and understood these before using this method.
drain
在接口中 MessagePassingQueue<E>
public int drain(MessagePassingQueue.Consumer<E> c, int limit)
MessagePassingQueue
M m;
int i = 0;
for(;i < limit && (m = relaxedPoll()) != null; i++){
c.accept(m);
}
return i;
There's no strong commitment to the queue being empty at the end of a drain. Called from a consumer thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Consumer.accept(T)
make sure you have read
and understood these before using this method.
drain
在接口中 MessagePassingQueue<E>
public void drain(MessagePassingQueue.Consumer<E> c, MessagePassingQueue.WaitStrategy w, MessagePassingQueue.ExitCondition exit)
MessagePassingQueue
int idleCounter = 0; while (exit.keepRunning()) { E e = relaxedPoll(); if(e==null){ idleCounter = wait.idle(idleCounter); continue; } idleCounter = 0; c.accept(e); }
Called from a consumer thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Consumer.accept(T)
make sure you have read
and understood these before using this method.
drain
在接口中 MessagePassingQueue<E>
public final long lvConsumerIndex()
public final long lvProducerIndex()