Что произойдет, если дважды вызвать метод start() у одного и того же объекта Thread в Java?

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

Ответ

При повторном вызове start() для одного потока будет выброшено неконтролируемое исключение IllegalThreadStateException.

Причина: Поток в Java имеет жизненный цикл. После вызова start() он переходит из состояния NEW в RUNNABLE (или сразу в запущенное состояние). Повторная попытка запуска потока, который уже вышел из состояния NEW, нарушает контракт метода и приводит к исключению.

Пример, демонстрирующий ошибку:

public class DoubleStartExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Поток выполняется.");
        });

        thread.start(); // Поток переходит в состояние RUNNABLE
        System.out.println("Первый start() выполнен.");

        try {
            thread.start(); // Попытка запустить тот же поток снова
        } catch (IllegalThreadStateException e) {
            System.err.println("Ошибка: " + e.getMessage());
            // Вывод: Ошибка: thread already started
        }
    }
}

Как правильно: Если нужно выполнить задачу повторно, следует создать новый экземпляр Thread или использовать механизмы повторного выполнения (например, ExecutorService).