Ответ
Методы run() и start() в классе java.lang.Thread выполняют принципиально разные роли в механизме многопоточности Java.
Метод run()
- Что делает: Содержит код, который должен выполняться в новом потоке.
- Как вызывается: Не следует вызывать напрямую. Он автоматически вызывается JVM после того, как поток будет инициализирован методом
start(). - Прямой вызов: Если вызвать
thread.run()напрямую, код выполнится в текущем потоке (например, в main), как обычный метод. Новый поток при этом не создается.
Метод start()
- Что делает: Запускает новый поток выполнения. JVM создает новый поток, выполняет необходимую низкоуровневую инициализацию и затем асинхронно вызывает метод
run()этого нового потока. - Однократность: Метод
start()можно вызвать для потока только один раз. Повторная попытка выброситIllegalThreadStateException.
Наглядный пример, демонстрирующий разницу:
public class ThreadDemo {
public static void main(String[] args) {
Runnable task = () -> {
System.out.println("Выполняется в потоке: " + Thread.currentThread().getName());
};
Thread thread = new Thread(task);
// НЕПРАВИЛЬНО: выполнится в потоке main
thread.run(); // Вывод: "Выполняется в потоке: main"
// ПРАВИЛЬНО: запускает новый поток
thread.start(); // Вывод: "Выполняется в потоке: Thread-0"
}
}
Итог: Для запуска задачи в отдельном потоке всегда используйте start(). Метод run() — это просто точка входа для кода задачи, которую вызывает система. Переопределяя run() (или передавая Runnable), вы определяете что выполнять, а вызывая start() — как (в новом потоке).