Жизненный цикл потока в ThreadDeath

Я хотел начать вычисление и завершить его пользователем Cancel. Вы говорите, что вызов Thead.stop() разблокирует все мониторы и вызовет ThreadDeath исключение. Это означает, что finally все еще вызывается.

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


person Little Alien    schedule 12.05.2016    source источник


Ответы (1)


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

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

person Nathan Hughes    schedule 12.05.2016
comment
Насколько я знаю, вы можете прерывать только ожидающие потоки, а не те, которые выполняют вычисления в разгаре. - person Little Alien; 13.05.2016
comment
@LittleAlien: да, прерываемый поток должен либо проверить свой флаг прерывания, либо заснуть, либо подождать. - person Nathan Hughes; 13.05.2016
comment
@LittleAlien: чтобы уточнить, я просто говорю, что существует крайний случай, когда у вас может не быть полной уверенности во всех случаях. - person Nathan Hughes; 17.05.2016