Easythread

В чём разница между Thread.start() и Thread.run()?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

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

Thread t = new Thread(() -> System.out.println("hi"));
t.start();   // НОВЫЙ поток, параллельно с main
t.run();     // обычный вызов в текущем потоке (частая ошибка)

// t.start(); // повторно — IllegalThreadStateException

Состояния потока (Thread.State):

  • NEW — создан, не запущен;
  • RUNNABLE — после start();
  • BLOCKED — ждёт monitor;
  • WAITINGObject.wait, Thread.join без timeout;
  • TIMED_WAITINGsleep, wait(timeout);
  • TERMINATED — после завершения run() (нельзя перезапустить).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.