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?

26
demandé sur kiamlaluno 2011-09-14 16:04:12

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.
20
répondu axtavt 2011-09-14 12:12:28

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");
}
14
répondu Andreas_D 2011-09-14 12:19:08

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.

3
répondu Thilo 2011-09-14 12:12:40

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é.

3
répondu Erick Robertson 2011-09-14 12:13:10

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

1
répondu Pratik 2011-09-14 12:13:53

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.

1
répondu AlexR 2011-09-14 12:15:29

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.

0
répondu James Drinkard 2011-10-16 03:46:23