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:
- Quando a última thread não deamon termina. O main é uma das threads desse tipo, e ela pode terminar normalmente.
- 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…