Garantia de release em um semaphore

3 respostas
M

Pessoal,

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??

Obrigado

3 Respostas

galileu.gt

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:

  1. try {
  2. while (!Thread.interrupted()) {
  3. ...
    
  4. }
  5. } catch (InterruptedException e) {
  6. }
  7. finally {
  8. //Código de finalização aqui, se necessário.
  9. }
M

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.

Criado 31 de maio de 2010
Ultima resposta 31 de mai. de 2010
Respostas 3
Participantes 2