ThreadGroup

3 respostas
bruno_r_santana

Olá pessoal,

Eu fiz um exemplo para testar ThreadGroup mas não entendi a saída. No código abaixo 3 threads do mesmo ThreadGroup começam a executar o método run então eu uso o método interrupt no grupo e todas threads são interrompidas e é executado o código do catch, mas não entendo porque depois de executar o que está dentro do catch é executado o println fora do catch já que as threads foram interrompidas:

class RunnableDeDestino implements Runnable{
    public void run(){
        try{
            Thread.sleep(3000);
        }catch(InterruptedException e){
            System.out.printf("thread " + Thread.currentThread().getName() + " interrompida %n");
        }
        
        System.out.printf("executando " + Thread.currentThread().getName() + "... %n"); //PENSEI QUE ESSA LINHA NÃO SERIA EXECUTADA NENHUMA VEZ
    }
}

public class GruposDeThreads {
    public static void main(String[] args){
        ThreadGroup tg = new ThreadGroup("grupo");
        RunnableDeDestino destino = new RunnableDeDestino();
        
        new Thread(tg, destino, "Thread 1").start();
        new Thread(tg, destino, "Thread 2").start();
        new Thread(tg, destino, "Thread 3").start();
        
        tg.interrupt();
    }
}

saída:

thread Thread 1 interrompida
thread Thread 2 interrompida
thread Thread 3 interrompida
executando Thread 2...
executando Thread 1...
executando Thread 3...

3 Respostas

Marcelo_SCS

De fato elas foram interrompidas, veja por esse código:

class RunnableDeDestino implements Runnable {

    @Override
    public void run() {
        try {
            System.out.println("Thread " + Thread.currentThread().getName() + " Working 1...");
            Thread.sleep(3000);
            System.out.println("Thread " + Thread.currentThread().getName() + " Working 2...");
            Thread.sleep(3000);
            System.out.println("Thread " + Thread.currentThread().getName() + " Finished");
        } catch (InterruptedException e) {
            System.out.printf("thread " + Thread.currentThread().getName() + " interrompida %n");
        }

        System.out.printf("executando " + Thread.currentThread().getName() + "... %n"); //PENSEI QUE ESSA LINHA NÃO SERIA EXECUTADA NENHUMA VEZ  
    }
}

Ao chamar interrupt da ThreadGroup, o mensagem working 2 não será impressa. Isso porque, o método interrupt faz com que a thread seja interrompida, lançando a exceção InterruptedException no método sleep.
Ver:
http://www.guj.com.br/java/139525-duvida-threads-interrupt-e-interruptedexception
Por ter sido capturada no try/catch, depois a Thread continua sua execução normal.

bruno_r_santana

Entendi. Obrigado Marcelo!

ViniGodoy

É importante entender o que “interrompida” significa.

O Java usa esse termo para dizer que os métodos de aguardo: sleep, wait e join, irão disparar uma InterruptedException. Isso geralmente irá fazer o código subir para fora do run() e parar a thread, mas, no caso de um catch, isso não ocorre. Se um catch pegar a exceção, o código continuará rodando a partir daquele ponto normalmente.

Não existe no java um método para “abortar” uma thread. Esse método antes existia e era chamado de stop(), mas foi deprecated devido ao fato dele gerar leak de recursos (arquivo se mantinham abertos, memória deixava de ser coletada, etc).

Criado 23 de dezembro de 2012
Ultima resposta 23 de dez. de 2012
Respostas 3
Participantes 3