Skip to content

Latest commit

 

History

History
27 lines (15 loc) · 4.41 KB

09 - Synchronization.md

File metadata and controls

27 lines (15 loc) · 4.41 KB

Тема 9. Примитивы синхронизации потоков

Требование к задачам:

  1. (обязательно) Все программы должны корректно завершаться. Это значит, что функция main должна завершать свою работу только после того, как завершены все остальные потоки, созданные в ходе работы программы.
  2. (обязательно) Если поток должен ждать какого-то события (а не просто заснуть на некоторое время), то такое ожидание нельзя реализовывать с помощью Thread.sleep или холостых циклов.
  3. Запускать потоки вы можете как самостоятельно (класс Thread), так и воспользоваться пулом потоков, например Executors.newCachedThreadPool().

Задача 1

Запустите N потоков. Каждый поток печатает M строк вида <номер потока>-<номер строки>. Добейтесь, чтобы сначала все потоки распечатали 1-ю строку, потом 2-ю, и т.д., то есть чтобы каждый поток печатал очередную строку только после того, как все потоки напечатали предыдущую строку.

Дополнительно: Сделайте так, чтобы каждую строку потоки печатали по порядку своих номеров. То есть, последовательность вывода должна быть 1-1, 2-1, 3-1, ..., 1-2, 2-2, 3-2, ...

Задача 2

Запустите N потоков с порядковыми номерами от 1 до N. Каждый поток засыпает на случайное время, а проснувшись, ждет своей очереди и печатает свой порядковый номер. Добейтесь, чтобы номера были распечатаны по возрастанию.

Задача 3

Запустите N потоков. Каждый поток пишет “поток <имя потока> создан” и ждет. Основной поток читает ввод пользователя. Как только пользователь вводит команду “старт”, все потоки начинают “работать” (спят еще некоторое случайное время), затем пишут на консоль “поток <имя потока> закончил работу” и завершаются. После того, как все потоки завершили работу, программа пишет “все потоки завершили работу” и завершается.

Задача 4

Реализуйте класс “Комната отдыха для потоков”. У него будет метод “зайти и отдохнуть”. Вызывающий его поток засыпает на случайное время. При этом в консоль пишется “поток (номер) зашел” и “поток (номер) вышел”. В комнате только K мест. Если комната заполнена, новые потоки, желающие отдохнуть, ждут, пока освободятся места. Запустите N потоков (N > K). Каждый из них какое-то время “работает” (время работы намного меньше времени отдыха), потом отдыхает в комнате, и так до бесконечности.

Дополнительно: Комната запускает потоки по одному, а выпускает только все вместе и только после того, как полностью наполнилась. То есть если какой-то поток уже отдохнул, он не может покинуть комнату, пока не закончат отдых остальные K-1 потоков в комнате. Потом они вместе выходят.