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

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

Ответ

run() — это обычный вызов метода в текущем потоке. start() — создает новый поток через JVM/ОС, который асинхронно выполняет метод run().

Ключевые отличия:

  • Поток выполнения: run() выполняется в вызывающем потоке (например, main), start() запускает новый поток.
  • Количество вызовов: start() можно вызвать для одного объекта Thread только один раз, run() — сколько угодно.
  • Назначение: start() предназначен для управления жизненным циклом потока, run() содержит код для выполнения.

Пример:

Thread thread = new Thread(() -> {
    System.out.println("Выполняется в: " + Thread.currentThread().getName());
});

thread.run();   // Вывод: "Выполняется в: main" (текущий поток)
thread.start(); // Вывод: "Выполняется в: Thread-0" (новый поток)

Почему важно: Вызов start() делегирует планирование потока операционной системе, что обеспечивает истинную параллельность (или конкурентность) на многоядерных CPU.