A queue lets worker threads take jobs from a shared input without manually choosing which worker receives each job.

Queue Worker Threads

queue_worker_threads.rb
worker_count = 
queue = Queue.new
completed = []
lock = Mutex.new

workers = worker_count.times.map do |worker_id|
  Thread.new do
    job = queue.pop
    lock.synchronize do
      completed << "#{worker_id}:#{job}"
    end
  end
end

worker_count.times do |index|
  queue.push("job#{index + 1}")
end

workers.each(&:join)

puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
worker_count = 
queue = Queue.new
completed = []
lock = Mutex.new

workers = worker_count.times.map do |worker_id|
  Thread.new do
    job = queue.pop
    lock.synchronize do
      completed << "#{worker_id}:#{job}"
    end
  end
end

worker_count.times do |index|
  queue.push("job#{index + 1}")
end

workers.each(&:join)

puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
worker_count = 
queue = Queue.new
completed = []
lock = Mutex.new

workers = worker_count.times.map do |worker_id|
  Thread.new do
    job = queue.pop
    lock.synchronize do
      completed << "#{worker_id}:#{job}"
    end
  end
end

worker_count.times do |index|
  queue.push("job#{index + 1}")
end

workers.each(&:join)

puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
queue workers Start workers first, push one job for each worker, then join after every queued job has been claimed.