2014-01-11 3 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 и затем ошибку. Я не понимаю, почему он выводит 2 каждый раз, когда имеет смысл вывести только 0, а затем выйти?Почему этот код Ruby Threading выводит 2?

ответ

2

Это проблема с расписанием. Нити не работают параллельно. Вместо этого интерпретатор Ruby непрерывно переключается между исполняемыми потоками.

В этом случае нить 1 вызывает исключение, которое должно обрабатываться. Это предположительно занимает достаточно времени, чтобы разрешить выполнение потока 2.

Попробуйте ввести sleep 0.1 между raise и линией print, что не должно приводить к отсутствию выхода.

Смежные вопросы