advanced/queues_that_wait.rb

tests/_examples/advanced/queues_that_wait.rb in the metorex repository.

# Taking from an empty queue waits for something to be put there, and a limit
# on how long to wait answers nothing once it passes.
line = Queue.new
p(line.pop(timeout: 0))

line.push(:first)
p(line.pop(timeout: 0))

# Asking for what is there right now rather than waiting is an error when
# there is nothing there.
begin
  line.pop(true)
rescue ThreadError => trouble
  p(trouble.message)
end

# A queue made with a limit takes nothing more while it is full, so a thread
# putting on it waits for a reader and is counted while it waits.
held = SizedQueue.new(1)
held.push(:one)
filling = Thread.new do
  held.push(:two)
end

Thread.pass until filling.stop?
p(held.num_waiting)
p(held.pop)
filling.join
p(held.pop)

Output:

nil
:first
"queue empty"
1
:one
:two