Думаю связано с тем что потоки не синхронизованы. Честно знаю об этом очень мало и уже почти два часа пытаюсь понять как решать эту задачу, пока что получается явно не так как планировал тот кто ее составлял. Направьте пожалуйста, ну или пните на худой конец
"All horses start the race!
Horse_01 has finished the race!
Waiting for Horse_02
Horse_02 has finished the race!
Exception in thread "main" java.lang.IllegalThreadStateException
at java.base/java.lang.Thread.start(Thread.java:791)
at com.javarush.task.task16.task1607.Solution.prepareHorsesAndStart(Solution.java:40)
at com.javarush.task.task16.task1607.Solution.main(Solution.java:13)"
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 (int i = 0; i < horses.size(); i++) {
if (horses.get(i).isFinished()) {
++finishedCount;
}
}
return finishedCount;
}
public static List<Horse> prepareHorsesAndStart(int horseCount) throws InterruptedException {
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));
}
System.out.println("All horses start the race!");
for (int i = 0; i < horseCount; i++) {
horses.get(i).start();
horses.get(i).join();
if (!horses.get(i + 1).isFinished() && (i + 1) < horses.size() && horses.get(i).isFinished()) {
System.out.println("Waiting for " + horses.get(i + 1).getName());
horses.get(i + 1).start();
}
}
return horses;
}
}
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;
}
}
}
}