Eine alternative Methode bietet die Bibliothek Monitor
.
require 'monitor'
buf = []
buf.extend(MonitorMixin)
empty_cond = buf.new_cond
# Konsument
Thread.start do
loop do
buf.synchronize do
empty_cond.wait_while { buf.empty? }
print buf.shift
end
end
end
# Produzent
while line = ARGF.gets
buf.synchronize do
buf.push(line)
empty_cond.signal
end
end
Der Produzent schiebt eine Zeile Text in das buf-Array
und übergibt durch den Aufruf von signal die Kontrolle
an den Konsumenten, der den Text aus dem Array ausliest. Wenn
der Konsument seinen synchronize-Block verlässt, erzeugt der Produzent
den nächsten Eintrag.