2016-05-12 5 views
2

Я хотел начать вычисление и прекратить его на пользователе Отмена. Вы говорите, что вызов Thead.stop() разблокирует все мониторы и вызывает исключение ThreadDeath. Это означает, что finally по-прежнему вызывается.Жизненный цикл резьбы по ThreadDeath

Предположим, что мне не нужны блокировки, но вы хотите освободить выделенные ресурсы. Я хотел бы, чтобы компенсатор знал/дождался окончания потока, выпустил его распределения. Предположим, что секция finally имеет бесконечный цикл в секции finally. Будет ли thread.join преуспеть в этой теме?

+4

Только не делайте этого. –

ответ

1

Это зависит от того, какой код выполняет поток в точке, где ThreadDeath выбрасывается. Например, если ваш поток остановлен так, как это происходит, чтобы достигнуть вершины блока finally, тогда у вас может возникнуть ситуация, когда ThreadDeath вызывается после того, как блок будет введен, но до того, как ресурс будет закрыт, и что, наконец, блок не будет завершено.

Было бы намного меньше подвержено ошибкам использовать прерывание, которое позволяет прерывать поток, полностью контролировать, как он заканчивается и закрывает свои ресурсы.

+0

AFAIK, вы можете прервать только ожидающие потоки, а не те, которые выполняют вычисления в жару. –

+0

@LittleAlien: да, прерванный поток должен либо проверить свой прерванный флаг, либо заснуть или подождать. –

+0

@LittleAlien: уточнить, я просто говорю, что этот крайный случай существует там, где у вас может не быть полной уверенности во всех случаях. –

 Смежные вопросы

  • Нет связанных вопросов^_^