Книга: Программирование на языке Ruby
13.1.6. Группы потоков
13.1.6. Группы потоков
Группа потоков — это механизм управления логически связанными потоками. По умолчанию все потоки принадлежат группе Default
(это константа класса). Но если создать новую группу, то в нее можно будет помещать потоки.
В любой момент времени поток может принадлежать только одной группе. Если поток помещается в группу, то он автоматически удаляется из той группы, которой принадлежал ранее.
Метод класса ThreadGroup.new
создает новую группу потоков, а метод экземпляра add
помещает поток в группу.
f1 = Thread.new("file1") { |file| waitfor(file) }
f2 = Thread.new("file2") { |file| waitfor(file) }
file_threads = ThreadGroup.new
file_threads.add f1
file_threads.add f2
Метод экземпляра list
возвращает массив всех потоков, принадлежащих данной группе.
# Подсчитать все "живые" потоки в группе this_group.
count = 0
this_group.list.each {|x| count += 1 if x.alive? }
if count < this_group.list.size
puts "Некоторые потоки в группе this_group уже скончались."
else
puts "Все потоки в группе this_group живы."
end
В класс ThreadGroup
можно добавить немало полезных методов. В примере ниже показаны методы для возобновления всех потоков, принадлежащих группе, для группового ожидания потоков (с помощью join
) и для группового завершения потоков:
class ThreadGroup
def wakeup
list.each { |t| t.wakeup }
end
def join
list.each { |t| t.join if t != Thread.current }
end
def kill
list.each { |t| t.kill }
end
end
- 13.1. Создание потоков и манипулирование ими
- Листинг 4.2. (thread-create2.c) Создание двух потоков
- Программное создание вторичных потоков
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Достоинства и недостатки потоков
- Организация пользователей в группы с помощью ролей
- Создание пользователя и группы на рабочей станции
- Группы
- II. Вовлечение группы в работу и создание атмосферы взаимопонимания
- Фокус-группы вместо пудры
- 4.2.1. Добавление группы
- 4.2.2. Редактирование группы