Blocking queue
feature
appearance
paper
function
- put(blocked)
- take(blocked)
- offer?(non-blocked, return bool)
- poll?(non-blocked, return null if empty)
- peek?(return null if empty)
- clear
- size
impl
array deque inner, also two queue store producer and consumer. differ from java, since hard to run javacall after unblock. if blocking, the rest of the request is done by the unblocker (producer do put, consumer do take). note that all request is in single thread.
put
- if full, block
- else:
- put inside the queue
- get one consumer, currently consumer is blocked from take
- do consumer's take but no need to unblock producer, cause currently producer should be empty
- unblock
for producer should be empty assume. any operation that decrease the size of array deque will fill from the producer queue first, so that, since array deque not full, indicated that all producer queue is already filled in and producer queue is empty.
take
- if empty, block
- else:
- take from the queue
- get one producer, currently producer is blocked from put
- do producer's put, same we don't need to do unblock consumer
- unblock
offer/pool
- if full/empty, return false
- else: same as put/take
peek
if empty: return null else: just peek
size
just return queue size
clear
- if empty: do nothing
- clear queue
- while: get the producer until queue full (i.e. get min(capacity, producer size))
- do producer's put, don't need to do unblock, since consumer is empty (base on fact that queue is not empty)