Class: Queue
Relationships & Source Files | |
Inherits: | Object |
Defined in: | thread_sync.c, thread_sync.c |
Overview
This class provides a way to synchronize communication between threads.
Example:
require 'thread'
queue = Queue.new
producer = Thread.new do
5.times do |i|
sleep rand(i) # simulate expense
queue << i
puts "#{i} produced"
end
end
consumer = Thread.new do
5.times do |i|
value = queue.pop
sleep rand(i/2) # simulate expense
puts "consumed #{value}"
end
end
Class Method Summary
-
.new
constructor
Creates a new queue instance.
Instance Attribute Summary
-
#closed? ⇒ Boolean
readonly
Returns
true
if the queue is closed. -
#empty? ⇒ Boolean
readonly
Returns
true
if the queue is empty.
Instance Method Summary
-
#<<(object)
(also: #push, #enq)
Pushes the given
object
to the queue. -
#clear
Removes all objects from the queue.
-
#close
Closes the queue.
-
#deq(non_block = false)
(also: #pop, #shift)
Retrieves data from the queue.
-
#enq(object)
Alias for #<<.
-
#length
(also: #size)
Returns the length of the queue.
-
#num_waiting
Returns the number of threads waiting on the queue.
-
#pop(non_block = false)
Alias for #deq.
-
#push(object)
Alias for #<<.
-
#shift(non_block = false)
Alias for #deq.
-
#size
Alias for #length.
Constructor Details
.new
Creates a new queue instance.
Instance Attribute Details
#closed? ⇒ Boolean
(readonly)
Returns true
if the queue is closed.
#empty? ⇒ Boolean
(readonly)
Returns true
if the queue is empty.
Instance Method Details
#push(object)
#enq(object)
#<<(object)
Also known as: #push, #enq
Pushes the given object
to the queue.
#clear
Removes all objects from the queue.
#close
Closes the queue. A closed queue cannot be re-opened.
After the call to close completes, the following are true:
-
#closed? will return true
-
close
will be ignored. -
calling enq/push/<< will return nil.
-
when #empty? is false, calling deq/pop/shift will return an object from the queue as usual.
::ClosedQueueError is inherited from ::StopIteration, so that you can break loop block.
Example:
q = Queue.new
Thread.new{
while e = q.deq # wait for nil to break loop
# ...
end
}
q.close
#pop(non_block = false)
#deq(non_block = false)
#shift(non_block = false)
Also known as: #pop, #shift
Retrieves data from the queue.
If the queue is empty, the calling thread is suspended until data is pushed onto the queue. If non_block
is true, the thread isn't suspended, and an exception is raised.
#push(object)
#enq(object)
#<<(object)
Alias for #<<.
#length
#size
Also known as: #size
Returns the length of the queue.
#num_waiting
Returns the number of threads waiting on the queue.
#pop(non_block = false)
#deq(non_block = false)
#shift(non_block = false)
Alias for #deq.
#push(object)
#enq(object)
#<<(object)
Alias for #<<.
#pop(non_block = false)
#deq(non_block = false)
#shift(non_block = false)
Alias for #deq.
#length
#size
Alias for #length.