Como garantir que caso uma thread morra, por qualquer motivo que seja, que o recursos alocado pela thread ( semaphore.aquire() ) será liberado ( semaphore.release() )???
Existe alguma garantia 100% que um finally sera executado ou um deprecated??
O codigo postado por ViniGodoy no post http://www.guj.com.br/posts/list/104229.java sugere que é possível prever o término da thread fazendo catch em InterruptedException. Nesse caso voce poderia tratar seu codigo de release no finally.
Fragmento do codigo postado no outro post:
try {
while (!Thread.interrupted()) {
...
}
} catch (InterruptedException e) {
}
finally {
//Código de finalização aqui, se necessário.
}
M
marciano1
Claro,
Porem a pergunta é: existe garantia de 100% que o finally é sempre realizado??? O que acontece se a thread morre?
galileu.gt
Não sei se a thread joga essa exceção em todos os casos em que ela é finalizada. Provavelmente não.
Bom, caso ocorra exceção ocorra, definitivamente o finally eh executado. O problema é se ela não jogar a excessão.
Existe o finalize() que os objetos podem implementar (chamado antes do objeto ser coletado pelo GC).
Mas tambem nao é o caso, nao há garantia de que apos a thread acabar, o objeto correspondente vai ser coletado pelo GC.
No pior dos casos, se voce nao descobrir, voce tera que implementar uma classe que gerencie sua thread e seus recursos.