2014-01-11 50 views
0
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,然後退出?爲什麼這個Ruby線程代碼輸出2?

回答

2

這是一個調度問題。線程並不真正並行運行。 Ruby解釋器不斷地在執行線程之間切換。

在這種情況下,線程1引發必須處理的異常。這大概需要足夠的時間來允許線程2執行。

嘗試在raiseprint行之間插入sleep 0.1,這應該導致根本沒有輸出。

相關問題