В целом с задачей проблем не было.
Остались вопросы по сабжу в целом.
Разрешите для начала описать, как я вижу картину, а дальше уже поправите меня, если я не прав.
Есть у нас интерфейс 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, это мы так к классу обращаемся ?
Я гуглил эти вещи и продолжу, но вдруг кто сможет однозначно сразу все пояснить.
Надеюсь на Вашу помощь. Спасибо!