Требование к задачам:
- (обязательно) Все программы должны корректно завершаться. Это значит, что функция
main
должна завершать свою работу только после того, как завершены все остальные потоки, созданные в ходе работы программы. - (обязательно) Если поток должен ждать какого-то события (а не просто заснуть на некоторое время), то такое ожидание нельзя реализовывать с помощью
Thread.sleep
или холостых циклов. - Запускать потоки вы можете как самостоятельно (класс
Thread
), так и воспользоваться пулом потоков, напримерExecutors.newCachedThreadPool()
.
Запустите N потоков. Каждый поток печатает M строк вида <номер потока>-<номер строки>. Добейтесь, чтобы сначала все потоки распечатали 1-ю строку, потом 2-ю, и т.д., то есть чтобы каждый поток печатал очередную строку только после того, как все потоки напечатали предыдущую строку.
Дополнительно: Сделайте так, чтобы каждую строку потоки печатали по порядку своих номеров. То есть, последовательность вывода должна быть 1-1, 2-1, 3-1, ..., 1-2, 2-2, 3-2, ...
Запустите N потоков с порядковыми номерами от 1 до N. Каждый поток засыпает на случайное время, а проснувшись, ждет своей очереди и печатает свой порядковый номер. Добейтесь, чтобы номера были распечатаны по возрастанию.
Запустите N потоков. Каждый поток пишет “поток <имя потока> создан” и ждет. Основной поток читает ввод пользователя. Как только пользователь вводит команду “старт”, все потоки начинают “работать” (спят еще некоторое случайное время), затем пишут на консоль “поток <имя потока> закончил работу” и завершаются. После того, как все потоки завершили работу, программа пишет “все потоки завершили работу” и завершается.
Реализуйте класс “Комната отдыха для потоков”. У него будет метод “зайти и отдохнуть”. Вызывающий его поток засыпает на случайное время. При этом в консоль пишется “поток (номер) зашел” и “поток (номер) вышел”. В комнате только K мест. Если комната заполнена, новые потоки, желающие отдохнуть, ждут, пока освободятся места. Запустите N потоков (N > K). Каждый из них какое-то время “работает” (время работы намного меньше времени отдыха), потом отдыхает в комнате, и так до бесконечности.
Дополнительно: Комната запускает потоки по одному, а выпускает только все вместе и только после того, как полностью наполнилась. То есть если какой-то поток уже отдохнул, он не может покинуть комнату, пока не закончат отдых остальные K-1 потоков в комнате. Потом они вместе выходят.