Почему обычные потоки одноразовые
Что проверяют
Понимаете ли вы жизненный цикл потока и почему из его одноразовости следует пул. Вопрос теоретический на вид, но ведёт к пулам: почему поток на запрос это дорого.
Как отвечать
У объекта Thread есть состояние, и оно движется только вперёд: NEW, затем работа, затем TERMINATED. Метод start разрешено вызвать ровно один раз, повторный вызов бросает IllegalThreadStateException, причём и на работающем, и на уже завершившемся. Перезапускать нечего: нативный поток операционной системы отдан обратно, его стек освобождён, а объект остался оболочкой, у которой осмысленно спросить разве что isAlive.
Главное, что хотят услышать: Thread это не задача, а ручка к потоку системы. Задача это Runnable или Callable, и её переиспользовать можно сколько угодно, просто обернув в новый поток.
Создание потока стоит системного вызова и отдельного стека в мегабайты, поэтому под нагрузкой потоки не создают на каждый запрос, а берут из пула, где поток крутится в цикле и вытаскивает задачи из очереди. Переиспользуется механизм, а не объект.
Если позиция на свежую платформу, добавьте про виртуальные потоки из Java 21: они тоже одноразовые, но дешёвые, и пул им не нужен, там модель поток на задачу. Если же вопрос был про Stream из Stream API, ответ по форме тот же: после терминальной операции повторное использование даёт IllegalStateException.
Где спотыкаются
Переносят вывод «нужен новый объект на каждый повтор» на пулы и создают ExecutorService внутри метода, обрабатывающего запрос. Пулы копятся, их потоки не завершаются без shutdown, и приложение упирается в лимит потоков.
Путают поток и задачу. Наследуются от Thread, хранят состояние выполнения в его полях, и повторный запуск невозможен уже не по правилам языка, а по смыслу: состояние осталось грязным. Задачу держат отдельно и без изменяемого состояния.
Думают, что поток можно просто остановить снаружи. Метод stop признан небезопасным и больше не работает, а interrupt лишь выставляет флаг: поток обязан его проверять или ждать в прерываемой операции. Код, который ловит InterruptedException и молча его глотает, превращает поток в неостанавливаемый.