T
- the type of the object in this queuepublic class WaitFreeReadQueue<T>
extends java.lang.Object
WaitFreeReadQueue
class is intended for single-reader
multiple-writer communication, although it may also be used (with
care) for multiple readers. A reader is generally an
instance of Schedulable
which may not use the heap, and the
writers are generally regular Java threads or heap-using
instances of Schedulable
. Communication is through a bounded
buffer of Objects that is managed first-in-first-out. The principal
methods for this class are write and read.
write
method appends a new element onto the queue.
It is synchronized, and blocks when the queue is full.
It may be called by more than one writer,
in which case, the different callers will write to different
elements of the queue.
read
method removes the oldest element from the queue.
It is not synchronized and does not block;
it will return null
when the queue is empty. Multiple reader
threads or schedulables are permitted, but when two or more intend to
read from the same WaitFreeWriteQueue
they will need to
arrange explicit synchronization.
waitForData()
method on a
queue that has been constructed with a notify
parameter
set to true
.
WaitFreeReadQueue
is one of the classes enabling
instances of Schedulable
that may not use the heap and
conventional Java threads to synchronize on an object without the risk of
that Schedulable instance incurring Garbage Collector latency due to
priority inversion avoidance management.
Incompatibility with V1.0: Three exceptions previously thrown by the constructor have been deleted. These are
java.lang.IllegalAccessException
,
java.lang.ClassNotFoundException
, and
java.lang.InstantiationException
.
Constructor and Description |
---|
WaitFreeReadQueue(int maximum,
boolean notify)
Constructs a queue containing up to
maximum
elements in immortal memory. |
WaitFreeReadQueue(int maximum,
MemoryArea memory,
boolean notify)
Constructs a queue containing up to
maximum
elements in memory . |
WaitFreeReadQueue(java.lang.Runnable writer,
java.lang.Runnable reader,
int maximum,
MemoryArea memory)
Constructs a queue containing up to
maximum
elements in memory . |
WaitFreeReadQueue(java.lang.Runnable writer,
java.lang.Runnable reader,
int maximum,
MemoryArea memory,
boolean notify)
Constructs a queue containing up to
maximum
elements in memory . |
Modifier and Type | Method and Description |
---|---|
void |
clear()
Sets
this to empty. |
boolean |
isEmpty()
Queries the queue to determine if
this is empty. |
boolean |
isFull()
Queries the system to determine if
this is full. |
T |
read()
Reads the least recently inserted element from the queue and returns
it as the result, unless the queue is empty.
|
int |
size()
Queries the queue to determine the number of elements in
this . |
void |
waitForData()
When
this is empty block until a writer
inserts an element. |
void |
write(T value)
A synchronized and blocking write.
|
public WaitFreeReadQueue(java.lang.Runnable writer, java.lang.Runnable reader, int maximum, MemoryArea memory, boolean notify) throws StaticIllegalArgumentException, MemoryScopeException, InaccessibleAreaException
maximum
elements in memory
. The queue has an unsynchronized and
nonblocking read()
method and a
synchronized and blocking write()
method.
The writer
and reader
parameters, when non-null,
are checked to insure that they are compatible with the
MemoryArea
specified by memory
(when
non-null.) When memory
is null
and both
Runnables are non-null, the constructor will select the
nearest common scoped parent memory area, or
when there is no such scope it will use immortal memory.
When all three parameters are null
, the queue will be
allocated in immortal memory.
reader
and writer
are not necessarily the only instances
of Schedule
that will access the queue; moreover,
there is no check that they actually access the queue at all.
Note that the wait free queue's internal queue is allocated in
memory
, but the memory area of the wait free queue
instance itself is determined by the current allocation context.
writer
- An instance of Runnable
or null
.reader
- An instance of Runnable
or null
.maximum
- The maximum number of elements in the queue.memory
- The MemoryArea
in which internal elements are
allocated.notify
- A flag that establishes
whether a reader is notified when the queue becomes non-empty.StaticIllegalArgumentException
- when an argument holds an invalid value.
The writer
argument must be null
, a reference to
a Thread
, or a reference to a schedulable
(a RealtimeThread
, or an AsyncEventHandler
.)
The reader
argument must be null
, a reference to
a Thread
, or a reference to a schedulable.
The maximum
argument must be greater than zero.InaccessibleAreaException
- when memory
is a scoped
memory that is not on the caller's scope stack.MemoryScopeException
- when
either reader
or writer
is non-null and the memory
argument is not
compatible with reader
and
writer
with respect to the assignment
and access rules for memory areas.public WaitFreeReadQueue(java.lang.Runnable writer, java.lang.Runnable reader, int maximum, MemoryArea memory) throws StaticIllegalArgumentException, MemoryScopeException, InaccessibleAreaException
maximum
elements in memory
. The queue has an unsynchronized and
nonblocking read()
method and a
synchronized and blocking write()
method.
Equivalent to
WaitFreeReadQueue(writer, reader, maximum, memory, false)
public WaitFreeReadQueue(int maximum, MemoryArea memory, boolean notify) throws StaticIllegalArgumentException, InaccessibleAreaException
maximum
elements in memory
. The queue has an unsynchronized and
nonblocking read()
method and a
synchronized and blocking write()
method.
Equivalent to
WaitFreeReadQueue(null, null, maximum, memory, notify)
StaticIllegalArgumentException
InaccessibleAreaException
public WaitFreeReadQueue(int maximum, boolean notify) throws StaticIllegalArgumentException
maximum
elements in immortal memory. The queue has an unsynchronized and
nonblocking read()
method and a
synchronized and blocking write()
method.
Equivalent to
WaitFreeReadQueue(null, null, maximum, null, notify)
StaticIllegalArgumentException
public void clear()
this
to empty.
Note, this method needs to be used with care.
Invoking clear
concurrently with read
or write
can lead to unexpected results.
public boolean isEmpty()
this
is empty.
Note: This method needs to be used with care since the state of the queue may change while the method is in progress or after it has returned.
true
when this
is empty;
false
when this
is not empty.public boolean isFull()
this
is full.
Note: This method needs to be used with care since the state of the queue may change while the method is in progress or after it has returned.
true
when this
is full;
false
when this
is not full.public T read()
null
is returned.T
read, or
else null
when this
is empty.public int size()
this
.
Note: This method needs to be used with care since the state of the queue may change while the method is in progress or after it has returned.
this
occupied by
elements that have been written but not yet read.public void waitForData() throws StaticUnsupportedOperationException, java.lang.InterruptedException
this
is empty block until a writer
inserts an element.
Note: When there is a single reader and no asynchronous invocation
of clear
, then it is safe to invoke read
after waitForData
and know that read
will find the queue non-empty.
Implementation note, to avoid reader and writer synchronizing on the same object, the reader should not be notified directly by a writer. (This is the issue that the non-wait queue classes are intended to solve).
StaticUnsupportedOperationException
- when this
has not
been constructed with notify
set to true
.java.lang.InterruptedException
- when the thread is interrupted
by interrupt()
or
AsynchronouslyInterruptedException.fire()
during
the time between calling this method and returning from it.InterruptedException
was
added to the throws
clause.public void write(T value) throws MemoryScopeException, java.lang.InterruptedException
value
- The java.lang.Object
that is placed in the queue.java.lang.InterruptedException
- when the thread is interrupted
by interrupt()
or
AsynchronouslyInterruptedException.fire()
during
the time between calling this method and returning from it.MemoryScopeException
- when a memory access error or
illegal assignment error would occur
while storing object
in the queue.StaticIllegalArgumentException
- when value
is
null
.true
, and
InterruptedException
was added to the throws clause.