为什么这个Ruby线程代码输出2?

时间:2014-01-11 13:01:46

标签: ruby

Thread.abort_on_exception = true
threads = 4.times.map do |number|
  Thread.new(number) do |i|
    raise "Boom!" if i == 1
    print "#{i}\n"
  end
end

puts "Waiting"
threads.each {|t| t.join }
puts "Done"

产生0,2然后错误。我不明白为什么每次只输出0然后退出才输出2?

1 个答案:

答案 0 :(得分:2)

这是一个调度问题。线程并不真正并行运行。相反,Ruby解释器在执行线程之间不断切换。

在这种情况下,线程1引发必须处理的异常。这可能需要足够的时间来允许线程2执行。

尝试在sleep 0.1raise行之间添加print,这样就不会产生任何输出。