public class MpscUnboundedXaddArrayQueue<E> extends MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>
MpscUnboundedArrayQueue it is designed to provide a better scaling when more
producers are concurrently offering.poll() could spin while awaiting a new element to be available:
to avoid this behaviour relaxedPoll() should be used instead, accounting for the semantic differences
between the twos.MessagePassingQueue.Consumer<T>, MessagePassingQueue.ExitCondition, MessagePassingQueue.Supplier<T>, MessagePassingQueue.WaitStrategychunkMask, chunkShift, freeChunksPool, maxPooledChunksb000, b001, b002, b003, b004, b005, b006, b007, b010, b011, b012, b013, b014, b015, b016, b017, b020, b021, b022, b023, b024, b025, b026, b027, b030, b031, b032, b033, b034, b035, b036, b037, b040, b041, b042, b043, b044, b045, b046, b047, b050, b051, b052, b053, b054, b055, b056, b057, b060, b061, b062, b063, b064, b065, b066, b067, b070, b071, b072, b073, b074, b075, b076, b077, b100, b101, b102, b103, b104, b105, b106, b107, b110, b111, b112, b113, b114, b115, b116, b117, b120, b121, b122, b123, b124, b125, b126, b127, b130, b131, b132, b133, b134, b135, b136, b137, b140, b141, b142, b143, b144, b145, b146, b147, b150, b151, b152, b153, b154, b155, b156, b157, b160, b161, b162, b163, b164, b165, b166, b167b170, b171, b172, b173, b174, b175, b176, b177UNBOUNDED_CAPACITY| Constructor and Description |
|---|
MpscUnboundedXaddArrayQueue(int chunkSize) |
MpscUnboundedXaddArrayQueue(int chunkSize,
int maxPooledChunks) |
| Modifier and Type | Method and Description |
|---|---|
int |
drain(MessagePassingQueue.Consumer<E> c,
int limit)
Remove up to limit elements from the queue and hand to consume.
|
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.
|
(package private) MpscUnboundedXaddChunk<E> |
newChunk(long index,
MpscUnboundedXaddChunk<E> prev,
int chunkSize,
boolean pooled) |
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. |
private MpscUnboundedXaddChunk<E> |
pollNextBuffer(MpscUnboundedXaddChunk<E> cChunk,
long cIndex) |
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.
|
private MpscUnboundedXaddChunk<E> |
spinForNextIfNotEmpty(MpscUnboundedXaddChunk<E> cChunk,
long cIndex) |
appendNextChunks, capacity, chunkSize, currentConsumerIndex, currentProducerIndex, drain, drain, fill, isEmpty, iterator, maxPooledChunks, moveToNextConsumerChunk, producerChunkForIndex, relaxedOffer, size, toStringcasConsumerIndex, lpConsumerChunk, lpConsumerIndex, lvConsumerChunk, lvConsumerIndex, soConsumerChunk, soConsumerIndexcasProducerChunkIndex, lvProducerChunk, lvProducerChunkIndex, soProducerChunk, soProducerChunkIndexgetAndAddProducerIndex, getAndIncrementProducerIndex, lvProducerIndexcontains, containsAll, remove, removeAll, retainAll, toArray, toArrayclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitclearpublic MpscUnboundedXaddArrayQueue(int chunkSize,
int maxPooledChunks)
chunkSize - The buffer size to be used in each chunk of this queuemaxPooledChunks - The maximum number of reused chunks kept around to avoid allocation, chunks are pre-allocatedpublic MpscUnboundedXaddArrayQueue(int chunkSize)
final MpscUnboundedXaddChunk<E> newChunk(long index, MpscUnboundedXaddChunk<E> prev, int chunkSize, boolean pooled)
newChunk in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>public boolean offer(E e)
MessagePassingQueueQueue.offer(Object) interface.e - not null, will throw NPE if it isprivate MpscUnboundedXaddChunk<E> pollNextBuffer(MpscUnboundedXaddChunk<E> cChunk, long cIndex)
private MpscUnboundedXaddChunk<E> spinForNextIfNotEmpty(MpscUnboundedXaddChunk<E> cChunk, long cIndex)
public E poll()
MessagePassingQueueQueue.poll() interface.null iff emptypublic E peek()
MessagePassingQueueQueue.peek() interface.null iff emptypublic E relaxedPoll()
MessagePassingQueueQueue.poll() this method may return null without the queue being empty.null if unable to pollpublic E relaxedPeek()
MessagePassingQueueQueue.peek() this method may return null without the queue being empty.null if unable to peekpublic int fill(MessagePassingQueue.Supplier<E> s)
MessagePassingQueuewhile(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 in interface MessagePassingQueue<E>fill in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,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 in interface MessagePassingQueue<E>drain in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,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.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get() make sure you have read
and understood these before using this method.