Вы упомянули сборку мусора в другом вопросе. В большинстве случаев после уничтожения сеанса он будет собирать мусор.
При запуске Java G C он может собирать все, что недоступно из сборки мусора root. Потоки относятся к одному типу root и никогда не собираются мусором, пока они работают.
Ваадин не может знать, каковы ваши намерения с потоками, и как их безопасно остановить. Таким образом, вы обязаны остановить их.
Как правило, существует два способа остановить поток, используя interrupt()
или с вашим собственным флагом.
Какой из них вы должны использовать, зависит от ваш вариант использования. Если ваш поток спит или иным образом ожидает, прерывание немедленно прервет его (как следует из названия), и будет выдан InterruptedException
.
Если вы go при таком подходе, измените свой while(true)
на while(!Thread.interrupted())
, и просто позвоните zombie.interrupt()
, чтобы остановить его. Если поток в данный момент спит, ваш блок catch
будет достигнут, поэтому вам, возможно, не потребуется регистрировать исключение, если оно работает нормально.
Примечание : Thread.interrupted()
сбрасывает прерванный флаг после того, как он вызван, так что вы не должны, например, вызывать его в блоке catch. Вы можете использовать isInterrupted()
, если хотите прочитать состояние без его сброса.
Другой вариант - использовать свой собственный флаг. Самый простой подход - добавить private volatile boolean stopped = false
и изменить while (true)
на while(!stopped)
.
Ключевое слово volatile
гарантирует, что значение не будет кэшировано в ЦП, что может привести к задержке времени, которое требуется чтобы ваш поток заметил изменение значения.
Затем вы можете добавить метод, чтобы остановить его, например, public void stop() { this.stopped = true; }
, и вызвать его в слушателе уничтожения сеанса. Поскольку этот подход не прерывает ожидающий поток, он всегда заканчивает sh текущую итерацию l oop, включая режим сна, если он в данный момент спит.