В целом с задачей проблем не было. Остались вопросы по сабжу в целом. Разрешите для начала описать, как я вижу картину, а дальше уже поправите меня, если я не прав. Есть у нас интерфейс Runnable. Этот интерфейс может только (имеет только метод) void run(); ----------------- Есть у нас класс Thread. Thread наследник Object. Thread умеет (implements) Runnable. У Thread есть метод run() - из документации: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns. У Thread есть метод start() - из документации: Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. ----------------- Допустим есть такой код:
package Test;

public class TestClass implements Runnable
{
    public void run() {} // здесь мы переопределили run() из интерфейса Runnable и вписали в его тело, то что нужно нам

  public static void main (String[] args)

  {
        TestClass testClass1 = new TestClass(); // здесь создал объект класса TestClass

        Thread thread1 = new Thread(testClass1);// создал объект класса Thread, куда в качестве входного аргумента
                                                // для конструктора пойдет нам testClass1
         thread1.start();   // запустили метод start класса Thread и завелся наш поток
  }
}
Вопросы: 1 Откуда наш класс знает, что существует такой класс как Thread ? Я понимаю, что завязано это скорей всего на родстве с Object, но конкретную линию отследить не могу. Если даже мы два потомка от Object, с чего мой класс должен знать методы/конструкторы Thread ? Ведь это 2 параллельные ветки. Прошу заметить, что я ничего не импортирую, не наследую - тем не менее компилятор не возникает и создает объект Thread 2 Мы передаем объект нашего класса на конструктор Thread, создали Thread, далее мы вызываем метод start(), который вызывает метод run() интерфейса Runnable ? Или у Thread есть свой переопределенный run() ? Вижу, что в документации указано, что у Thread свой run(), но тогда не совсем понятно, как Thread видит наш вариант run(). Можете. пожалуйста , прояснить, кто чей run() запускает. 3 Если мы создадим несколько потоков для одного объекта, то они будут дергать его поля как им вздумается ? Всм есть какая-то логика в том, как многопоточные события будут делить между собой один объект ? 4. Конкретно в этой задаче (1620), есть такой момент
for (int i = 0; i < countThreads; i++) {
         threads.get(i).start();
     }
Т.е. достаем потоки из листа и стартуем один за одним. Вот стартанули мы первый поток, он пришел на вход метода run(), он для этого метода же будет this ? Почему мы должна вытаскивать инфу из потока так?
public void run() {

            boolean isCurrentThreadInterrupted = Thread.currentThread().isInterrupted() ;
            String threadName = Thread.currentThread().getName();
Почему нельзя сделать что-то типа this.getName() ? Thread.currentThread().getName() - первое слово Thread, это мы так к классу обращаемся ? Я гуглил эти вещи и продолжу, но вдруг кто сможет однозначно сразу все пояснить. Надеюсь на Вашу помощь. Спасибо!