Non sopravvivono. La JVM uscirà quando tutti i thread, tranne quelli daemon, sono morti.
Quando si avvia l'applicazione, la JVM avvierà un singolo thread non demone per eseguire il metodo principale statico.
Una volta terminato il metodo principale, questo thread principale morirà e se non si generano altri thread non daemon, la JVM uscirà.
Se tuttavia è stato avviato un altro thread, la JVM non uscirà, attenderà che tutti i thread non daemon muoiano prima di uscire.
Se quel thread generato genera qualcosa di vitale, questa è assolutamente la cosa giusta da fare, tuttavia spesso si hanno dei thread che non sono così importanti, forse stanno ascoltando alcuni eventi esterni che potrebbero o meno accadere.
Quindi, in teoria, è necessario posizionare un codice da qualche parte per interrompere tutti i thread generati per consentire l'uscita dalla JVM.
Poiché questo è soggetto a errori, è molto più semplice contrassegnare tali thread non vitali come daemon. Se sono contrassegnati come tali, la JVM non aspetterà che muoiano prima di uscire, la JVM uscirà e ucciderà quei thread quando i "thread principali" (quelli non contrassegnati come demone) sono morti.
Per dirla in codice, è qualcosa di simile:
public class Spawner {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
System.out.println("I'm still alive");
}
}
});
t.start();
// Try uncommenting/commenting this line
// t.setDaemon(true);
System.out.println("Main thread has finished");
}
}
(non ho ancora testato questo codice, ha scritto qui direttamente, in modo che possa contenere errori stupidi).
Quando si esegue questo codice con la riga commentata, il thread non è deamon, quindi anche se il metodo principale ha finito, si continuerà ad avere la console inondata fino a quando non la si interrompe con CTRL + C. Cioè, la JVM non uscirà.
Se si decommenta la riga, il thread è un daemon e poco dopo il termine del metodo principale, il thread verrà ucciso e la JVM verrà chiusa senza la necessità di CTRL + C.
Stai solo fraintendendo cosa vuol dire _attendere i thread daemon per finire_. Fine significa completare l'esecuzione del metodo 'run' di Runnable'. –
Dove dice che sopravvivono? La tua domanda non ha senso, – EJP