A thread main e as outras

5 respostas
renatosilva

Um programa java termina:

(1) quando a útlima thread termina, ou seja, a thread do main pode vir a terminar, mas o programa roda ainda por conta das outras, ou…

(2) quando a thread do main termina, ou seja, o main termina, mas não a sua thread, que ficaria “gerenciando as outras” ???

5 Respostas

ViniGodoy

Ele termina:

  1. Quando a última thread não deamon termina. O main é uma das threads desse tipo, e ela pode terminar normalmente.
  2. Quando a VM termina (pode ser através do System.exit(0)).

Quem gerencia as threads é a VM (e o controle é feito pelo SO), não a thread do main.

renatosilva

Ih cara mas pelo o que testei não é isso não, a thread do main nunca termina, ela fica esperando as outras threads:

public class Teste {
	public static void main(String[] args) {		
		new Tirred().start();		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {}
		System.out.println(Thread.currentThread().getName() + " rodando (" + Thread.activeCount() + " threads) - FIM DO MAIN");
	}	
}

class Tirred extends Thread {	
	@Override public void run() {
		while (true) {			
			System.out.println(getName() + " rodando (" + Thread.activeCount() + " threads)");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
ViniGodoy

Rode seu programa num debugger.

Você vai ver que a thread do main morre, e toma o seu lugar uma nova thread, chamada “DestroyJavaVM”. Essa outra thread é quem espera que as outras terminem, limpa o ambiente e mata a VM.

ViniGodoy

Ok, alterei seu programa para que você possa ver o que falei sem um depurador:

public class Teste {   
    public static void main(String[] args) {           
        new Tirred().start();         
        try {   
            Thread.sleep(1000);   
        } catch (InterruptedException e) {}   
        System.out.println("----> FIM DO MAIN <-----");   
    }     
}   
  
class Tirred extends Thread {     
    @Override public void run() {   
        while (true) {             
            Thread array[] = new Thread[Thread.activeCount()];
            Thread.enumerate(array);            
            System.out.println(getName() + " rodando " + Thread.activeCount() + " threads: ");
            for (Thread t : array)
                System.out.println(t.getName() + " ");
            System.out.println();
            
            try {   
                Thread.sleep(1000);   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
        }   
    }   
}

Agora ele imprime não só a quantidade de threads, mas também o nome das threads rodando.

renatosilva

Valeuzão Vini… já já vou dar uma olhada nisso…

Criado 27 de novembro de 2007
Ultima resposta 27 de nov. de 2007
Respostas 5
Participantes 2