我想提出兩個解決方案:
第一個是有效地加入一個線程,但加入必須從主線程調用(假設你從主啓動所有工作線程):
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
但該方法是一種低效的,因爲一遍遍創建線程導致內存和CPU開銷。
你應該更好地使用隊列同步重用線程池固定:
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 }
這是否在重塑車輪?你可以使用許多現有的消息隊列之一嗎? – 2010-10-29 12:18:48