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.
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:
publicclassTeste{publicstaticvoidmain(String[]args){newTirred().start();try{Thread.sleep(1000);}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()+" rodando ("+Thread.activeCount()+" threads) - FIM DO MAIN");}}classTirredextendsThread{@Overridepublicvoidrun(){while(true){System.out.println(getName()+" rodando ("+Thread.activeCount()+" threads)");try{Thread.sleep(1000);}catch(InterruptedExceptione){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: