Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

thread = Thread.new do

 t = Thread.current

 x = "nXxeQPdMdxiBAxh"

 t[:my_message] = x

 x.reverse!

 x.delete! "x"

 x.gsub!(/[A-Z]/,"")

 # С другой стороны, присваивание создает новый объект,

 # поэтому "сокращение" становится бесполезным...

end

а = thread[:my_message] # "hidden"

Ясно,

что сокращение не будет работать и в том случае, когда вы имеете дело с объектами наподобие
Fixnum
, которые хранятся как непосредственные значения, а не ссылки.

13.1.3. Опрос и изменение состояния потока

В классе

Thread
есть несколько полезных методов класса. Метод
list
возвращает массив «живых» потоков, метод
main
возвращает ссылку на главный поток программы, который породил все остальные, а метод
current
позволяет потоку идентифицировать самого себя.

t1 = Thread.new { sleep 100 }

t2 = Thread.new do

 if Thread.current == Thread.main

 puts "Это главный поток." # HE печатается,

end

1.upto(1000) { sleep 0.1 }

end

count = Thread.list.size # 3

if Thread.list.include ?(Thread.main)

 puts "Главный поток жив." # Печатается всегда!

end

if Thread.current == Thread.main

 puts "Я главный поток." # Здесь печатается...

end

Методы

exit
,
pass
,
start
,
stop
и
kill
служат для управления выполнением потоков (как изнутри, так и извне):

# в главном потоке...

Thread.kill(t1) # Завершить этот поток.

Thread.pass # Передать управление t2.

t3 = Thread.new do

 sleep 20

 Thread.exit # Выйти из потока.

 puts "Так не бывает!" # Никогда не выполняется.

end

Thread.kill(t2) # Завершить t2.

# Выйти из главного потока (все остальные тоже завершаются).

Thread.exit

Отметим, что не существует метода экземпляра

stop
, поэтому поток может приостановить собственное выполнение, но не выполнение другого потока.

Существуют различные методы для опроса состояния потока. Метод экземпляра

alive?
сообщает, является ли данный поток
«живым» (не завершил выполнение), а метод
stop?
— находится ли он в состоянии «приостановлен».

count = 0

t1 = Thread.new { loop { count += 1 } }

t2 = Thread.new { Thread.stop }

sleep 1

flags = [t1.alive?, # true

t1.stop?, # false

t2.alive?, # true

t2.stop?] # true

Получить состояние потока позволяет метод

status
. Он возвращает значение
"run"
, если поток выполняется;
"sleep"
— если он приостановлен, спит или ожидает результата ввода/вывода;
false
— если поток нормально завершился, и
nil
— если поток завершился в результате исключения.

t1 = 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 # false

s5 = t5.status # nil

Глобальную переменную

$SAFE
можно установить по-разному в разных потоках. Стало быть, она вовсе не является глобальной, но стоит ли жаловаться на это, если она позволяет разным потокам работать с разным уровнем безопасности? Метод
safe_level
возвращает текущий уровень безопасности потока.

t1 = Thread.new { $SAFE = 1; sleep 5 }

t2 = Thread.new { $SAFE = 3; sleep 5 }

sleep 1

lev0 = Thread.main.safe_level # 0

lev1 = t1.safe_level # 1

lev2 = t2.safe_level # 3

Метод доступа

priority
позволяет узнать и изменить приоритет потока:

t1 = Thread.new { loop { sleep 1 } }

t2 = Thread.new { loop { sleep 1 } }

t2.priority = 3 # Установить для потока t2 приоритет 3

p1 = t1.priority # 0

p2 = t2.priority # 3

Поток с большим приоритетом будет чаще получать процессорное время. Специальный метод

pass
позволяет передать управление планировщику. Иными словами, поток просто уступает свой временной квант, но не приостанавливается и не засыпает.

t1 = Thread.new do

 puts "alpha"

 Thread.pass

Поделиться:
Популярные книги

Трудно быть солнцем

Леонтьев Антон Валерьевич
Детективы:
прочие детективы
криминальные детективы
7.86
рейтинг книги
Трудно быть солнцем

Дважды одаренный. Том VII

Тарс Элиан
7. Дважды одаренный
Фантастика:
аниме
фэнтези
попаданцы
5.57
рейтинг книги
Дважды одаренный. Том VII

Чай и водка в истории России

Похлебкин Вильям Васильевич
Дом и Семья:
кулинария
6.25
рейтинг книги
Чай и водка в истории России

Башня Миров. Начало пути

Бельский Сергей Фёдорович
Фантастика:
фэнтези
боевая фантастика
4.00
рейтинг книги
Башня Миров. Начало пути

Бесы в погонах

Серегин Михаил Георгиевич
Праведник
Детективы:
боевики
5.50
рейтинг книги
Бесы в погонах

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Короли

Key Lo
5.00
рейтинг книги
Короли

"Фантастика 2023-193". Компиляция. Книги 1-24

Федоров Алексей Евгеньевич
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-193. Компиляция. Книги 1-24

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Пепел удачи

Политов Дмитрий Валерьевич
Фантастика:
боевая фантастика
5.29
рейтинг книги
Пепел удачи

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Телохранитель Генсека. Том 1

Разгневанные почтальоны

Мэрфи Уоррен
104. Дестроер
Детективы:
боевики
5.00
рейтинг книги
Разгневанные почтальоны

Гражданский процесс

Чечота Д М
Научно-образовательная:
юриспруденция
5.00
рейтинг книги
Гражданский процесс

Завещание предков

Стрелков Владислав Валентинович
Приключения:
исторические приключения
6.14
рейтинг книги
Завещание предков