Quand le thread principal arrêter en Java?
J'ai lu cette déclaration:
Le thread principal doit être le dernier thread à terminer l'exécution. Lorsque le thread principal s'arrête, le programme se termine.
Est-ce vrai?
J'ai aussi appris que "même si le thread principal meurt, le programme continue à fonctionner".
Pour autant que je sache: lorsque vous démarrez un programme, JVM crée un thread pour exécuter votre programme. La JVM crée un thread utilisateur pour exécuter un programme. Ce fil est appelé thread principal. La principale méthode de la classe est appelée à partir du thread principal. Si le programme génère de nouveaux threads à partir du thread principal, il s'arrête jusqu'à ce que le dernier thread meurt.
Lequel est vrai?
7 réponses
Le programme se termine lorsque tous les threads non-daemon meurent (le thread daemon est un thread marqué par setDaemon(true)
; Il est généralement utilisé pour les threads utilitaires). À partir de javadoc:
Lorsqu'une Machine virtuelle Java démarre, il existe généralement un seul thread non démon (qui appelle généralement la méthode nommée main d'une classe désignée). La Machine virtuelle Java continue d'exécuter des threads jusqu'à ce que l'une des opérations suivantes se produise:
- la méthode exit de L'exécution de la classe a été appelé et le responsable de la sécurité a autorisé l'opération de sortie à avoir lieu.
- Tous les threads qui ne sont pas des threads du démon sont morts, soit en revenant de l'appel à la méthode run, soit en lançant une exception qui se propage au-delà de la méthode run.
J'ai lu cette déclaration: "Le thread principal doit être le dernier fil pour terminer l'exécution. Lorsque le thread principal s'arrête, le programme se termine."Est-il vrai?
Non, ce n'est pas le cas. La machine virtuelle se termine si Le Dernier thread non-démon est terminé. Il ne doit pas être le fil principal.
Exemple:
public static void main(String[] args) {
System.out.println("Main thread started");
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Second thread started");
try {
Thread.sleep(2000); // wait two seconds
} catch(Exception e){}
System.out.println("Second thread (almost) finished");
}
}).start();
System.out.println("Main thread (almost) finished");
}
Lorsque le thread principal s'arrête, le programme se termine.
Le programme se termine lorsqu'il n'y a plus de thread non-démon en cours d'exécution (ou quelqu'un appelé System.sortie). Le fil principal peut avoir fini il y a longtemps.
La JVM quittera lorsque le thread principal et tous les threads non-démon finiront l'exécution.
Lorsque vous créez un nouveau thread, vous pouvez appeler Thread.setDaemon(true)
pour en faire un thread démon. Si vous faites cela, la JVM n'attendra pas que ce thread se termine avant l'exécution. Ceci est utile pour tous les threads que vous créez qui sont faits pour fonctionner en arrière-plan jusqu'à ce que le programme s'arrête.
Si vous créez un nouveau thread et n'appelez pas Thread.setDaemon(true)
, la JVM retardera la sortie jusqu'à ce que ce thread soit complet, même si le fil principal est terminé.
Lorsque le thread principal a été démarré, il n'attendra pas l'autre thread créé par nous jusqu'à ce qu'ils ne puissent pas utiliser la join () de la classe thread pour attendre ce thread. Donc, fondamentalement, si le thread enfant ou le sous-thread obtient plus de temps pour traiter la tâche et que vous n'utilisez pas la join (), le thread principal peut être arrêté. Pour conserver avec le thread principal, vous devez utiliser la join () afin que le thread principal s'arrête après que ce thread lié soit stop
Vérifiez ceci lien
Http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29
Le premier état n'est pas exact.
Le programme java se termine lorsque tous les threads non-démon ont été terminés ou lorsque System.exit()
ou Runtime.exit()
est appelé.
Le Thread est terminé lorsqu'il a quitté sa méthode run()
. Le thread principal est spécial car vous n'implémentez pas explicitement sa méthode run()
, vous implémentez main()
à la place et le main()
est appelé à partir de run()
. Ainsi, le thread principal est terminé lorsque main()
est terminé.
Mais le fil principal n'est pas nécessairement le dernier.
C'est le 3ème brouillon de la spécification JVM, donc c'est le plus récent que je connaisse:
5.7 Sortie De La Machine Virtuelle
La machine virtuelle Java met fin à toute son activité: * tous les threads qui ne sont pas des threads démon se terminent. * Certains threads appellent la méthode exit de Class Runtime ou de class System, et l'opération de sortie est autorisée par le responsable de la sécurité.
Il N'y a pas de distinction faite sur le fil principal, donc nous ne devrait pas supposer que c'est le seul auquel cela s'applique.