В Java потоки не уничтожаются, но остановка потока выполняется кооперативным способом . Поток просят прекратить, и затем поток может корректно завершиться.
Часто используется поле volatile boolean
, которое поток периодически проверяет и завершает, когда ему присваивается соответствующее значение.
I не будет использовать boolean
, чтобы проверить, должен ли поток завершить . Если вы используете volatile
в качестве модификатора поля, это будет работать надежно, но если ваш код становится более сложным, так как вместо этого используются другие методы блокировки внутри цикла while
, может случиться, что ваш код не прекратит работу вообще или, по крайней мере, занимает больше времени , как вы можете.
Некоторые методы блокировки библиотеки поддерживают прерывание.
Каждый поток уже имеет логический флаг Прерванный статус , и вы должны использовать его. Это может быть реализовано так:
public void run() {
try {
while (!interrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
Исходный код адаптирован из Параллелизм Java на практике . Поскольку метод cancel()
является общедоступным, вы можете позволить другому потоку вызывать этот метод так, как вам нужно.