Я бы предложил два решения:
первое - это эффективное объединение в потоке, но соединение должно вызываться из основного потока (при условии, что вы запустили все свои рабочие потоки из основного):
def thread_proc(s)
sleep rand(5)
puts "#{Thread.current.inspect}: #{s}"
end
strings = ["word", "test", "again", "value", "fox", "car"]
threads = []
2.times {
threads << Thread.new(strings.shift) { |s| thread_proc(s) }
}
while !threads.empty?
threads.each { |t|
t.join
threads << Thread.new(strings.shift) { |s| thread_proc(s) } unless strings.empty?
threads.delete(t)
}
end
но этот метод неэффективен, потому что создание потоков снова и снова приводит к перегрузке памяти и ЦП.
Вы должны лучше синхронизировать фиксированный пул повторно используемых потоков, используя Очередь:
require 'thread'
strings = ["word", "test", "again", "value", "fox", "car"]
q = Queue.new
strings.each { |s| q << s }
threads = []
2.times { threads << Thread.new {
while !q.empty?
s = q.pop
sleep(rand(5))
puts "#{Thread.current.inspect}: #{s}"
end
}}
threads.each { |t| t.join }