Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Thread.stop puts "Вы находитесь в точке Y2."endsleep 1t1.wakeupt2.runМежду этими методами есть тонкое различие. Метод
wakeuprunВ данном случае
t1t2t2Вы находитесь в точке Y2.Здесь есть изумруд.Конечно, было бы неосмотрительно реализовывать синхронизацию на основе этого механизма.
Метод экземпляра
raisefactorial1000 = Thread.new do begin prod = 1 1.upto(1000) {|n| prod *= n } puts "1000! = #{prod}" rescue # Ничего не делать... endendsleep 0.01 # На вашей машине значение может быть иным.if factorial1000.alive? factorial1000.raise("Стоп!") puts "Вычисление было прервано!"else puts "Вычисление успешно завершено."endПоток, запущенный в предыдущем примере, пытался вычислить факториал 1000. Если для этого не хватило одной сотой секунды, то главный поток завершит его. Как следствие, на относительно медленной машине будет напечатано сообщение «Вычисление было прервано!» Что касается части
rescue13.1.4. Назначение рандеву (и получение возвращенного значения)
Иногда главный поток хочет дождаться завершения другого потока. Для этой цели предназначен метод
joint1 = Thread.new { do_something_long() }do_something_brief()t1.join # Ждать завершения t1.Отметим, что вызывать метод
joinjoinmeaning_of_life = Thread.new do puts "Смысл жизни заключается в..." sleep 10 puts 42endsleep 9meaning_of_life.joinСуществует полезная идиома, позволяющая вызвать метод
joinjoinThread.list.each { |t| t.join if t != Thread.main }Конечно, любой поток, а не только главный, может вызвать
joinjointhr = Thread.new { sleep 1; Thread.main.join }thr.join # Тупиковая ситуация!С потоком связан блок, который может возвращать значение. Следовательно, и сам поток может возвращать значение. Метод
valuejoinmax = 10000thr = Thread.new do sum = 0 1.upto(max) { |i| sum += i } sumendguess = (max*(max+1))/2print "Формула "if guess == thr.value puts "правильна."else puts "неправильна."end13.1.5. Обработка исключений
Что произойдет, если в потоке возникнет исключение? Как выясняется, поведение можно сконфигурировать заранее.
Существует флаг
abort_on_exceptionabort_on_exceptiontrueThread.abort_on_exception = truet1 = Thread.new do puts "Привет!" sleep 2 raise "some exception" puts "Пока!"endt2 = Thread.new { sleep 100 }sleep 2puts "Конец"В этом примере флаг
abort_on_exceptiontruet1t1
