Thread как остановить поток java
4 года назад
Человек-Молекула
Ответы
Принудительно останавливать поток крайне не рекомендуется. Соответствующий метод был признан "нежелательным" к использованию (Документация Oracle). Проблема в том, что поток может быть остановлен в процессе выполнения операции и приведет к ошибке, которую сложно будет выявить и исправить. Кроме того, внезапная остановка может привести к потере данных.
Вместо принудительной остановки потока необходимо использовать метод оповещения о прекращении работы потока - interrupt()
. Данный метод установит флаг прерывания потока (прекращения работы), который можно проверить методом isInterrupted()
и указать логику его обработки и завершения работы потока.
Если же поток был заблокирован, находился в ожидании (wait, sleep, join), то будет сброшен флаг прерывания и выброшено исключение InterruptedException
. В таком случае, после обработки исключения и для прерывания потока, необходимо заново установить флаг прерывания методом interrupt()
.
Пример:
При запуске данного кода будет выполнено 3 задачи, хотя в цикле сгенерируется 5 задач. Все потому, что метод interrupt()
будет вызван с 3-х секундной задержкой, поток выполнит текущую задачу (в данном случае 3-ю) и завершится.
3 года назад
Игорь Черкасов