Получить доступ

Чем вызов start() у потока отличается от прямого вызова run()?

JuniorМногопоточность
Ещё спрашивают так:
  • Как создать поток в Java?
  • Можно ли вызвать start() у потока дважды?
Коротко

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

  • Повторный start() → IllegalThreadStateException: поток одноразовый
  • Способы: Thread с Runnable, ExecutorService, виртуальные потоки

А ещё В современном коде потоки руками почти не создают — задачи отдают в пул

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Thread.start() просит JVM создать новый поток выполнения; в нём будет вызван метод run(). Сам start() сразу возвращает управление, и теперь код работает параллельно.

Если вызвать run() напрямую, никакого нового потока не появится: метод выполнится в текущем потоке, как любой другой. Это классическая ошибка — код выглядит многопоточным, но работает последовательно, и заметно это только по производительности или по имени потока в логах.

Объект Thread одноразовый: повторный start() бросит IllegalThreadStateException, даже если поток уже завершился.

Способы запустить задачу:

  • new Thread(runnable).start() — вручную, для учебных примеров;
  • ExecutorService — пул потоков, основной вариант в приложениях;
  • Thread.ofVirtual().start(...) или Executors.newVirtualThreadPerTaskExecutor() — виртуальные потоки (Java 21).

Наследоваться от Thread обычно не стоит — лучше передавать Runnable или Callable.

Пример

Runnable task = () -> System.out.println(Thread.currentThread().getName());
task.run();                 // main
new Thread(task).start();   // Thread-0

Что хотят услышать

  • start() создаёт поток, run() — обычный вызов.
  • Одноразовость объекта Thread.
  • Современные способы: пулы и виртуальные потоки.

Частые ошибки

  • Вызывать run() напрямую и считать, что работа идёт параллельно.
  • Пытаться повторно запустить завершившийся поток.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓start() создаёт новый поток выполнения; run() просто выполняет метод в текущем потоке, как обычный вызов
  • ✗Разницы нет, это синонимы
  • ✗run() создаёт поток, а start() лишь помечает его готовым
  • ✗start() выполняет метод синхронно и дожидается результата

Что спросят дальше

  • Почему объект потока нельзя запустить дважды?
  • Зачем задачи обычно отдают в пул, а не создают потоки вручную?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем