Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
t1 = Thread.new { sleep 100 }t2 = Thread.new do if Thread.current == Thread.main puts "Это главный поток." # HE печатается,end1.upto(1000) { sleep 0.1 }endcount = Thread.list.size # 3if Thread.list.include ?(Thread.main) puts "Главный поток жив." # Печатается всегда!endif Thread.current == Thread.main puts "Я главный поток." # Здесь печатается...endМетоды
exitpassstartstopkill# в главном потоке...Thread.kill(t1) # Завершить этот поток.Thread.pass # Передать управление t2.t3 = Thread.new do sleep 20 Thread.exit # Выйти из потока. puts "Так не бывает!" # Никогда не выполняется.endThread.kill(t2) # Завершить t2.# Выйти из главного потока (все остальные тоже завершаются).Thread.exitОтметим, что не существует метода экземпляра
stopСуществуют различные методы для опроса состояния потока. Метод экземпляра
alive?stop?count = 0t1 = Thread.new { loop { count += 1 } }t2 = Thread.new { Thread.stop }sleep 1flags = [t1.alive?, # true t1.stop?, # false t2.alive?, # true t2.stop?] # trueПолучить состояние потока позволяет метод
status"run""sleep"falsenilt1 = Thread.new { loop {} }t2 = Thread.new { sleep 5 }t3 = Thread.new { Thread.stop }t4 = Thread.new { Thread.exit }t5 = Thread.new { raise "exception" }s1 = t1.status # "run"s2 = t2.status # "sleep"s3 = t3.status # "sleep"s4 = t4.status # falses5 = t5.status # nilГлобальную переменную
$SAFEsafe_levelt1 = Thread.new { $SAFE = 1; sleep 5 }t2 = Thread.new { $SAFE = 3; sleep 5 }sleep 1lev0 = Thread.main.safe_level # 0lev1 = t1.safe_level # 1lev2 = t2.safe_level # 3Метод доступа
priorityt1 = Thread.new { loop { sleep 1 } }t2 = Thread.new { loop { sleep 1 } }t2.priority = 3 # Установить для потока t2 приоритет 3p1 = t1.priority # 0p2 = t2.priority # 3Поток с большим приоритетом будет чаще получать процессорное время. Специальный метод
passt1 = Thread.new do puts "alpha" Thread.pass puts "beta"endt2 = Thread.new do puts "gamma" puts "delta"endt1.joint2.joinВ этом искусственном примере вызов
Thread.passalpha gamma delta betaalpha beta gamma deltaВыполнение приостановленного потока можно возобновить методами методами
runwakeupt1 = Thread.new do Thread.stop puts "Здесь есть изумруд."endt2 = Thread.new do
