2013-05-07 14 views
10

poiché main() viene eseguito su una discussione. e non appena termina lo main(), il thread principale dovrebbe interrompersi. Quindi, se main() ha richiamato un thread di lunga durata che deve ancora terminare anche dopo che main() ha eseguito tutte le attività. Poiché viene restituito main(), gli altri thread verranno interrotti? immagino di no. ma perché?se il metodo principale completa l'esecuzione, cosa succede a qualsiasi thread di lunga durata?

public static void main(String[] s){  
    new LongRunningThread().start(); 
} 
+1

La JVM si chiude solo una volta completati tutti i thread non daemon. Quindi sì, il tuo programma uscirà dopo il completamento del tuo lungo task. – assylias

risposta

7

Il processo termina quando non ci sono più thread non demone, uccidere le discussioni daemon se necessario. Tuttavia, se lo fa ha thread non demone, quelli impediranno il processo di terminare.

Da Thread.setDaemon:

Marks questa discussione sia come thread demone o un thread utente. La Java Virtual Machine si chiude quando gli unici thread in esecuzione sono tutti i thread daemon.

Questo metodo deve essere richiamato prima dell'avvio del thread.

E da section 12.8 of the JLS:

un programma termina tutta la sua attività e uscite quando una delle due cose accade:

  • Tutti i fili che non sono daemon thread terminano.

  • Alcuni thread richiama il metodo exit di class Runtime o class System e l'operazione di uscita non è proibita dal gestore sicurezza.

+0

Su una nota correlata, in quale stato sarebbe il thread principale? dal momento che l'esecuzione è completa ma altri thread impediscono l'arresto. – Ankit

+1

@Ankit: No, altri thread impediscono * il processo di terminare *. Il thread principale è terminato e non esiste più. Ma il processo continua a funzionare perché ci sono altri thread in primo piano. –

1

se il filo conduttore lungo non è un thread demone, non otterrà risolto una volta che le principali uscite filo. La JVM continua a eseguire i thread fino a quando non viene chiamato il metodo di uscita di Runtime (e consentito l'esecuzione) o tutti i thread non daemon sono morti. Se il thread a lungo termine non è un thread daemon, JVM non si chiuderà (cioè, il thread continuerà a essere disponibile per l'esecuzione).

+0

Ho appena visto il post sopra di Jon - ti suggerirei di usarlo come risposta. –

1

Per rispondere alla tua domanda perché, è perché rendere il thread un thread non demone significa che non vuoi che venga interrotto bruscamente, vuoi che venga terminato in modo ordinato eseguendo fino al completamento o essendo cancellato. Se il tuo thread è stato ucciso dalla JVM una volta uscito il main, sarebbe stato equivalente a rendere il thread un demone.

Problemi correlati