Уже дня три смотрю на задачу как баран на новые ворота, а решение даже в голову не идет. Смотрел видео по Runable и Thread, по видео все понятно в реальности сделать ничего не могу. Понимания кода нет сколько не пытаюсь разобраться не понимаю. Из за того что не могу нормально прочитать код не могу составить решение. Начинаю волноваться что я немного тупой уже лезут мысли в голову что java не осилю. Помогите кто чем может. Понимаю что на этой теме начинаю сыпаться. Я закоментирую что понимаю что не понимаю пропущу. Условие Задачи: Horse Racing Разберись, что делает программа. Реализуй метод calculateHorsesFinished. Он должен: 1. Посчитать количество финишировавших лошадей и возвратить его. Используй метод isFinished(). 2. Если лошадь еще не пришла к финишу (!isFinished()), то: 2.1. Вывести в консоль "Waiting for " + horse.getName(). 2.2. Подождать, пока она завершит гонку. Подумай, какой метод нужно использовать для этого. 2.3. Не считать такую лошадь финишировавшей. Требования: 1. Метод calculateHorsesFinished должен вернуть количество финишировавших лошадей. 2. Метод calculateHorsesFinished должен вызывать метод isFinished у каждой лошади из переданного списка. 3. Если какая-либо из переданных в списке лошадей еще не финишировала, метод calculateHorsesFinished должен вывести в консоль "Waiting for " + horse.getName(). Пример сообщения для первой лошади: "Waiting for Horse_01". 4. Если какая-либо из переданных в списке лошадей еще не финишировала, метод calculateHorsesFinished должен подождать пока она финиширует. Используй правильный метод для ожидания. 5. После завершения работы программы, консоль должна содержать информацию о том, что все лошади финишировали. Пример сообщения для первой лошади: "Horse_01 has finished the race!".
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); // 1. создали лист и идем в п. 2 что бы узнать что помещаем и передаем в него 10
                                                                                         // 19. В итоге Хр"н пойми что мы сюда добавили после стольких кругов. далее п.20
        while (calculateHorsesFinished(horses) != horses.size()) { // 20.Пока не будет равен размеру лошадей далее п.21
        }
    }

    public static int calculateHorsesFinished(List<Horse> horses) throws InterruptedException { // 21. а дальше просто не понимаю
        int finishedCount = 0;
        //напишите тут ваш код

        return finishedCount;
    }

    public static List<Horse> prepareHorsesAndStart(int horseCount) { // 2. метод который возвратит Лист с объектами Horse и принимает 10 идем п.3
        List<Horse> horses = new ArrayList<>(horseCount); // 3. создали лист объектов размером 10 ячеек идем п.4
        String number; //  4. Создали Строку number идем п.5
        for (int i = 1; i < horseCount + 1; i++) { // 5. Создали цикл на 10 оборотов идем п.6
            number = i < 10 ? ("0" + i) : "" + i; // 6. number присвоим = 01,02,03... или 10 идем в п.7
            horses.add(new Horse("Horse_" + number)); // 7. в Лист вложили новый объект, Horse ,в него же передаем "Horse_" + 1..2..3.. идем в п.8
                                                                                    // 7. но здесь же, я не понимаю что мы вкладываем в Лист?????
                                                                                    // 7. не понятно что хранит сейчас Лист? идем в п.9
        }

        for (int i = 0; i < horseCount; i++) { // 9. создали цикл на 10 оборотов идем в п.10
            horses.get(i).start(); // 10. поднимаем из листа, только непонятно что поднимаем, и вот это непонятное стартует run() далее идем в п.11
        }
        return horses;
    }

    public static class Horse extends Thread {

        private boolean isFinished;

        public Horse(String name) { // 8. передали имя в переменную в супер класса Thread
            super(name);
        }

        public boolean isFinished() {
            return isFinished;
        }

        public void run() { // 11. старт далее п.12
            String s = ""; // 12 создали строку далее п.13
            for (int i = 0; i < 1001; i++) {   // Delay // 13. цикл на 1000 далее п.14
                s += "" + i; // 14. пустая трата памяти далее п.15
                if (i == 1000) { // 15. если i равен 1000 далее п.16
                    s = " has finished the race!"; // 16. s присвоить текст далее п.17
                    System.out.println(getName() + s); // 17. вывод на экран супер имени далее с текстом далее п.18.
                    isFinished = true; // 18.  Я так понимаю здесь лошадь добежала.
                }
            }
        }
    }
}