IndexedQueueSizeUtil.IndexedQueue
, MessagePassingQueue<E>
, QueueProgressIndicators
public class SpscGrowableAtomicArrayQueue<E>
extends java.util.AbstractQueue<E>
MessagePassingQueue.Consumer<T>, MessagePassingQueue.ExitCondition, MessagePassingQueue.Supplier<T>, MessagePassingQueue.WaitStrategy
Modifier and Type | Field | Description |
---|---|---|
protected java.util.concurrent.atomic.AtomicReferenceArray<E> |
consumerBuffer |
|
protected long |
consumerIndex |
|
protected long |
consumerMask |
|
protected java.util.concurrent.atomic.AtomicReferenceArray<E> |
producerBuffer |
|
protected long |
producerBufferLimit |
|
protected long |
producerIndex |
|
protected long |
producerMask |
UNBOUNDED_CAPACITY
Constructor | Description |
---|---|
SpscGrowableAtomicArrayQueue(int capacity) |
|
SpscGrowableAtomicArrayQueue(int chunkSize,
int capacity) |
Modifier and Type | Method | Description |
---|---|---|
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 wait,
MessagePassingQueue.ExitCondition exit) |
Remove elements from the queue and hand to consume forever.
|
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() |
|
protected java.util.concurrent.atomic.AtomicReferenceArray<E> |
lvNextArrayAndUnlink(java.util.concurrent.atomic.AtomicReferenceArray<E> curr) |
|
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. |
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. |
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 |
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.
|
protected void |
soNext(java.util.concurrent.atomic.AtomicReferenceArray<E> curr,
java.util.concurrent.atomic.AtomicReferenceArray<E> next) |
|
java.lang.String |
toString() |
contains, containsAll, remove, removeAll, retainAll, toArray, toArray
contains, containsAll, equals, hashCode, parallelStream, remove, removeAll, removeIf, retainAll, spliterator, stream, toArray, toArray
clear
protected long producerBufferLimit
protected long producerMask
protected java.util.concurrent.atomic.AtomicReferenceArray<E> producerBuffer
protected volatile long producerIndex
protected volatile long consumerIndex
protected long consumerMask
protected java.util.concurrent.atomic.AtomicReferenceArray<E> consumerBuffer
public SpscGrowableAtomicArrayQueue(int capacity)
public SpscGrowableAtomicArrayQueue(int chunkSize, int capacity)
public int capacity()
MessagePassingQueue.UNBOUNDED_CAPACITY
if not boundedpublic final java.util.Iterator<E> iterator()
iterator
in class java.util.AbstractCollection<E>
public final int size()
MessagePassingQueue
size
in interface MessagePassingQueue<E>
size
in class java.util.AbstractCollection<E>
Integer.MAX_VALUE
but less or equals to
capacity (if bounded).public final boolean isEmpty()
MessagePassingQueue
isEmpty
in interface MessagePassingQueue<E>
isEmpty
in class java.util.AbstractCollection<E>
public java.lang.String toString()
toString
in class java.util.AbstractCollection<E>
public long currentProducerIndex()
QueueProgressIndicators
currentProducerIndex
in interface QueueProgressIndicators
public long currentConsumerIndex()
QueueProgressIndicators
currentConsumerIndex
in interface QueueProgressIndicators
protected final void soNext(java.util.concurrent.atomic.AtomicReferenceArray<E> curr, java.util.concurrent.atomic.AtomicReferenceArray<E> next)
protected final java.util.concurrent.atomic.AtomicReferenceArray<E> lvNextArrayAndUnlink(java.util.concurrent.atomic.AtomicReferenceArray<E> curr)
public boolean relaxedOffer(E e)
MessagePassingQueue
Queue.offer(Object)
this method may return false without the queue being full.relaxedOffer
in interface 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
in interface MessagePassingQueue<E>
public E relaxedPeek()
MessagePassingQueue
Queue.peek()
this method may return null without the queue being empty.relaxedPeek
in interface 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.drain
in interface 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.fill
in interface 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.
drain
in interface MessagePassingQueue<E>
public 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.
fill
in interface MessagePassingQueue<E>
public void drain(MessagePassingQueue.Consumer<E> c, MessagePassingQueue.WaitStrategy wait, 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.
drain
in interface 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.
fill
in interface MessagePassingQueue<E>
public boolean offer(E e)
Queue.offer(Object)
interface.
This implementation is correct for single producer thread use only.
offer
in interface MessagePassingQueue<E>
e
- not null, will throw NPE if it ispublic E poll()
Queue.poll()
interface.
This implementation is correct for single consumer thread use only.
poll
in interface MessagePassingQueue<E>
public E peek()
Queue.peek()
interface.
This implementation is correct for single consumer thread use only.
peek
in interface MessagePassingQueue<E>
public final long lvProducerIndex()
public final long lvConsumerIndex()
Copyright © 2013–2017. All rights reserved.