В чем разница между методами run() и start() в классе Thread?

«В чем разница между методами run() и start() в классе Thread?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Методы 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()как (в новом потоке).