Альтернатива Thread.stop() в Java 8?

Есть ли способ заставить Thread остановиться в Java 8, теперь, когда Thread.stop был удален? Это включает в себя принудительный поток, ожидающий завершения цикла блокировки/синхронизации/ожидания/ожидания/бесконечности.

Это предназначено как часть сторожевого пса для приложения, которое может обнаружить, что оно заблокировано/заморожено, принудительно убивает потоки, а затем сохраняет текущее состояние во избежание потери информации - в то время как существует высокая вероятность того, что эта информация будет повреждена из-за чтобы заставить поток остановиться, лучше иметь копию, возможно, неправильной информации, чем потерять ее.

Попытка сохранить эту информацию, не останавливая заблокированные потоки, невозможна, так как ее сохранение потребует блокировки.

Ответы

Ответ 1

Если вам действительно нужно остановить Thread трудный способ, вы можете подумать, что метод Thread.stop() (без предоставления произвольного Throwable) по-прежнему работает с Java 8. Он будет генерировать ThreadDeath в остановленном потоке, который можно обрабатывать, как и любой другой Error, несмотря на свое необычное имя. Единственное отличие состоит в том, что трассировка стека не будет напечатана, если ThreadDeath не будет обнаружен.


Но будьте осторожны, что этот метод устарел для большинства тех же причин, кроме другого метода stop. Он может стать неподдерживаемым в одном из следующих выпусков Java. Так что его еще время подумать о плане Б...

Ответ 2

Прочитайте эти статьи, они объяснят это:

Джошуа Блох объясняет, как остановить поток и сказать следующее:

Рассмотрим задачу остановки одного потока от другого. Библиотеки предоставить метод Thread.stop, но этот метод был устаревшим назад, потому что он по своей сути небезопасен - его использование может привести к коррупция. Не используйте Thread.stop. Рекомендуемый способ остановить один нить из другого заключается в том, чтобы первый опрос потока выполнял логическое поле это изначально ложно, но для второго потока можно установить значение true указывают, что первый поток должен остановиться сам.

При использовании этого метода вы также должны обрабатывать синхронизацию булевского поля. Я не хочу копировать слишком много материалов из книги Джошуа Блоха, но вы найдете все там и в официальной документации Oracle Java, упомянутой выше.

Ответ 3

Правильный способ остановить поток - вызвать interrupt на нем.