A thread main e as outras

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

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.

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();
			}
		}
	}
}

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.

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

[code]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();   
        }   
    }   
}   

} [/code]

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

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