ho appena scritto il seguente codice come un test:
public class DaemonThreadPlay {
public static void main(String [] args) {
Thread daemonThread = new Thread() {
public void run() {
while (true) {
try {
System.out.println("Try block executed");
Thread.sleep(1000l);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
@Override
public void finalize() {
System.out.println("Finalize method called");
}
};
daemonThread.setDaemon(true);
daemonThread.start();
try {
Thread.sleep(2500l);
} catch (Throwable t) {
//NO-OP
}
}
}
ho messo i punti di interruzione nel blocco catch del filo demone e nel metodo di finalizzazione. Nessun punto di interruzione è stato raggiunto anche se il blocco try è stato eseguito. Ovviamente questo codice ha problemi di sincronizzazione/temporizzazione, ma penso che possiamo tranquillamente concludere che i thread daemon non sono interrotti allo shutdown, né i loro metodi finalize() necessariamente invocati.
È sempre possibile aggiungere un gancio di arresto alla JVM Durata:
Thread shutdownHook = ... // construct thread that somehow
// knows about all the daemon threads
Runtime.getRuntime().addShutdownHook(shutdownHook);
vostro gancio di arresto può ovviamente fare tutto ciò che le attività sono necessarie per un arresto "graziosa".
Hai guardato il codice sorgente? –
@StephenC Questo non mi è mai venuto in mente e fornirebbe sicuramente una risposta definitiva (sebbene non sia necessariamente utile). Personalmente, tuttavia, non sono abbastanza coraggioso da tentare di farlo e non mi aspetto davvero nessun altro. –
Va bene, fammi essere più esplicito. Il modo migliore per rispondere a una domanda come questa è guardare il codice sorgente, o almeno il codice Java. In generale è facile da leggere e ben commentato.(E non riesco a capire come una risposta definitiva a una domanda sia meno utile di una non definitiva ... specialmente se * tu * fosse la persona che legge il codice!) –