Я так понимаю порядок работы:
1 создали два объекта с параметрами
2 запустили два потока Теперь получилось три потока вместе с главным
3 Дальше не понятно То есть run()метод будет работать пока isStoped - false или что не понятно
зачем два раза усыплять потоки, что за stopwatch мы его тоже запускаем что ли
Помогите разобраться
Обанин Евгений Геннадьевич
41 уровень
задачу решил Но хотелось бы понять принцип работы
Решен
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
YuriyExpert
7 ноября 2019, 07:29решение
В классе Solution определен глобальный флаг остановки isStopped который при инициализации снят.
Класс Stopwatch - это эмулятор таймера, который создается для бегуна (объект класса Runner) и в цикле (пока не будет поднят глобальный флаг isStopped) выводит информацию о каждом сделанном им шаге. Таймер создается в конструкторе бегуна.
В методе main создаются 2 бегуна (каждый со своим таймером), обоим дается отмашка на старт (вызов метода start каждого бегуна вызывает новый Thread с его таймером). С этого момента одновременно работают три Thread - главный и таймеры каждого из бегунов.
"Усыпляем" главный Thread на 2 секунды. За это время первый бегун должен успеть сделать 8 шагов, а второй 4. Но, т.к. дочерние Thread стартуют не мгновенно, фактическое время работы дочерних Thread будет не 2с, а на пару мс меньше, т.е. каждый из бегунов успеет сделать на 1 шаг меньше.
После того как основной Thread просыпается, мы поднимаем флаг остановки. Дочерние Thread проверив состояние флага завершают цикл. Чтобы главный Thread не завершился прервав дочерние, мы еще раз усыпляем его на 1с. В течении этой секунды дочерние потоки заканчивают выполнение текущего шага своего цикла и завершаются (первый бегун делает 8 шаг, второй - 4). Остается работать только главный Thread, который завершится после того как проснется.
Чтобы лучше понять что происходит можно после isStopped вывести какую-нибудь строку, например "-------" - тогда информация о последнем шаге каждого бегуна будет под этой линией, а о всех предыдущих шагах над ней. А в методе run() класса Stopwatch после цикла while добавить что-нибудь вроде:
+14
Обанин Евгений Геннадьевич
7 ноября 2019, 08:15
Огромное спасибо Все понятно
0