Como tratar exceções que ocorrem dentro de uma Thread? [RESOLVIDO]

Tenho duas classes:

  • A classe que implementa Runnable
  • A classe Main, que starta a Thread

Quando ocorrer uma exceção dentro do método run(), enquanto a Thread é executada, preciso que a classe Main saiba que houve uma exceção na Thread e dê o tratamento devido.

A minha Thread:


public class MyThread implements Runnable(){

@Override
public void run(){

        try{
        //executa tal ação
        } catch(Exception e){
           //acontece uma exceção aqui
        }                
    
   }
}

A classe que chama a Thread:

public class Main{

       public void agoraVai(){
             
            MyThread myThread = new MyThread();
            Thread th = new Thread(myThread);

            //gostaria que existisse algo do tipo
            try{
            th.start();
            } catch(ExcecaoDentroDaThreadException e){
               //executa tratamento 
            }

       }
}

Sei que não posso fazer try/catch após executar uma Thread pq quando chamo start() o resto do código de Main é executado e a nossa Thread ganha emancipação e tem vida própria.
Mas, como trato em Main as exceções que ocorrem dentro da Thread?

A melhor dica até agora foi essa: http://www.guj.com.br/posts/list/50321.java#264645
Grato

De fato, sem ser com Callables, não dá para tratar tais exceções de forma trivial - a thread mesmo é que irá ter de tratar a tal exceção, não o criador das threads.

Por que você precisa tratar a exception no main?

Bom, algumas alternativas:
a) Usar callables (como já descrito no link);
b) Fazer sua thread tratar a exception e gerar um evento quando isso ocorrer. Nesse caso, basta usar o padrão observer.
c) Se for só para gerar um log, passar o componente de log (ou uma cópia dele) para a thread em questão. Note que se você for compartilhar a referência do componente de log, esse deverá ter métodos sincronizados.

1 curtida

Resposta: código antigo escrito de uma maneira muito do futuro e que agora precisa “ganhar novos recursos”. POG Design de Pattern é, nesse caso, uma saída bastante interessante e que vem a calhar, rsrsrsrsrsrs

Mas a sua dica do Callable resolveu aqui Vini. Prometo que quando eu precisar tratar as Threads com mais carinho, em algum projeto novo que eu comece a partir do zero, não vou tratar as Exceptions na Main rsrsrs. Mais uma vez você me ajudou, dessa vez com um post antigo, rsrs

Abrass, bom trabalho a todos