public static int calculateHorsesFinished(List<Horse> horses) throws InterruptedException {
int finishedCount = 0;
for (Horse hors : horses) {
if(hors.isFinished())
finishedCount++;
else if(!(hors.isFinished())) {
System.out.println("Waiting for " + hors.getName());
hors.join(); //почему на неё?!
}
}
return finishedCount;
}
Николай
16 уровень
Задачу решил, но не понял, почему join() нужно ставить именно на ту лошадь, которая не успевает? join() ведь тормозит этот поток, давая время завершится другому потоку. В таком разе ждать должны все лошади, которые уже пришли к финишу...
Архивный
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Дмитрий Ильин
30 июля 2020, 08:12
Метод join() заставляет текущий поток ждать завершения нити, к которой применяется.Только после этого текущий поток сможет продолжить выполнение кода.
0
См3ртЪ Inside
24 июня 2020, 20:01
Привнесу и своё объяснение. Метод join() не тормозит поток для которого вызван, давая время другому потоку, а даёт время для завершения тому потоку для которого вызван, тормозя все остальные потоки...
+1
Александр
4 июня 2020, 18:27
Иными словами приостанавливается главный поток вызывающий метод calculateHorsesFinished пока к финишу не придет лошадь. Главный поток ждет пока не финиширует проверяемая лошадь.
+1
Дмитрий Кравчук
4 июня 2020, 18:26
Суть в том, что при выполнение программы создается 11 потоков.
Основной - выполняющий метод main, при его выполнении 10 раз вызывается конструктор лошади. Каждый вызов конструктора запускает созданный "лошадиный" поток. Метод jion() выполняется в рамках основного потока. Дальше работает как описала Татьяна.
+1
Татьяна Java Developer в Сбербанк Expert
4 июня 2020, 18:23
Этот метод ожидает завершения того потока, для которого он вызван.
+1