Это мы получаем на выходе.
Waiting for Horse_01
Horse_01 has finished the race!
Waiting for Horse_02
Horse_04 has finished the race!
Horse_08 has finished the race!
Horse_05 has finished the race!
Horse_09 has finished the race!
Horse_06 has finished the race!
Horse_02 has finished the race!
Waiting for Horse_03
Horse_07 has finished the race!
Horse_10 has finished the race!
Horse_03 has finished the race!
Вопрос таков: почему когда ожидается окончание работы обьекта Waiting for Horse_02, мы видим как другие обьекты заканчивают свою работу, а вторая лошадь Horse_02 закачивает свою работу, только после окончания работы пяти обьектов. С третьей лошадью аналогично. Почему лошади : 4, 8, 5, 9, 6. Заканчивают свою работу раньше второй. Хотя мы ее ждем.
Farhad
26 уровень
Задача решена, но не допонята.
Архивный
package com.javarush.task.task16.task1607; import java.util.ArrayList; import java.util.List; /* Horse Racing */ public class Solution { public static void main(String[] args) throws InterruptedException { List<Horse> horses = prepareHorsesAndStart(10); while (calculateHorsesFinished(horses) != horses.size()) { } } public static int calculateHorsesFinished(List<Horse> horses) throws InterruptedException { int finishedCount = 0; //напишите тут ваш код for(Horse i : horses){ if(!i.isFinished()){ System.out.println("Waiting for " + i.getName()); i.join(); }else finishedCount++; } return finishedCount; } public static List<Horse> prepareHorsesAndStart(int horseCount) { List<Horse> horses = new ArrayList<>(horseCount); String number; for (int i = 1; i < horseCount + 1; i++) { number = i < 10 ? ("0" + i) : "" + i; horses.add(new Horse("Horse_" + number)); } for (int i = 0; i < horseCount; i++) { horses.get(i).start(); } return horses; } public static class Horse extends Thread { private boolean isFinished; public Horse(String name) { super(name); } public boolean isFinished() { return isFinished; } public void run() { String s = ""; for (int i = 0; i < 1001; i++) { // Delay s += "" + i; if (i == 1000) { s = " has finished the race!"; System.out.println(getName() + s); isFinished = true; } } } } }