java function - Quand devrions-nous appeler System.exit en Java




5 Answers

System.exit() peut être utilisé pour exécuter des hooks d'arrêt avant que le programme ne se ferme. C'est un moyen pratique de gérer l'arrêt dans les programmes plus importants, où toutes les parties du programme ne peuvent pas (et ne devraient pas) être conscientes l'une de l'autre. Ensuite, si quelqu'un veut quitter, il peut simplement appeler System.exit() , et les hooks d'arrêt (s'il est correctement configuré) prennent soin de faire toutes les cérémonies d'arrêt nécessaires telles que la fermeture de fichiers, la libération de ressources, etc.

"Cette méthode ne revient jamais normalement." signifie simplement que la méthode ne reviendra pas; une fois qu'un fil y va, il ne reviendra pas.

Un autre moyen, peut-être plus courant, de quitter un programme consiste simplement à atteindre la fin de la méthode main . Mais si des threads non-démon sont en cours d'exécution, ils ne seront pas arrêtés et la JVM ne se fermera donc pas. Ainsi, si vous avez de tels threads non-démon, vous avez besoin d'autres moyens (que les hooks d'arrêt) pour fermer tous les threads non-démon et libérer d'autres ressources. S'il n'y a pas d'autres threads non démon, le retour de main éteindra la JVM et appellera les hooks d'arrêt.

Pour une raison quelconque, les hameçons d'arrêt semblent être un mécanisme sous-évalué et mal compris, et les gens réinventent la roue avec toutes sortes de hacks personnalisés pour quitter leurs programmes. Je voudrais encourager l'utilisation de crochets d'arrêt; tout est là dans le Runtime standard que vous utiliserez quand même.

program system.exit(0)

En Java, Quelle est la différence avec ou sans System.exit(0) dans le code suivant?

public class TestExit
{      
    public static void main(String[] args)
    { 
        System.out.println("hello world");

        System.exit(0);  // is it necessary? And when it must be called? 
    }      
}

Le document dit: "Cette méthode ne revient jamais normalement." Qu'est-ce que ça veut dire?




System.exit(0) termine la JVM. Dans des exemples simples comme celui-ci, il est difficile de percevoir la différence. Le paramètre est renvoyé au système d'exploitation et est normalement utilisé pour indiquer une terminaison anormale (par exemple une sorte d'erreur fatale), donc si vous appelez java à partir d'un fichier batch ou d'un script shell, vous pourrez obtenir cette valeur si l'application a réussi

Cela aurait un impact considérable si vous System.exit(0) sur une application déployée sur un serveur d'applications (pensez-y avant de l'essayer).




Dans les applications qui peuvent avoir des hooks d'arrêt complexes, cette méthode ne doit pas être appelée à partir d'un thread inconnu. System.exit ne se System.exit jamais normalement car l'appel est bloqué jusqu'à la fin de la JVM. C'est comme si le code était en cours d'exécution et que la prise d'alimentation était branchée dessus avant de pouvoir terminer. L'appel de System.exit lancera les hooks d'arrêt du programme et tout thread appelé par System.exit jusqu'à la fin du programme. Cela implique que si le hook d'arrêt soumet à son tour une tâche au thread à partir duquel System.exit été appelé, le programme sera bloqué.

Je gère cela dans mon code avec ce qui suit:

public static void exit(final int status) {
    new Thread("App-exit") {
        @Override
        public void run() {
            System.exit(status);
        }
    }.start();
}



Il ne faut JAMAIS appeler System.exit (0).

  1. C'est un "goto" caché, et "gotos" casse le flux de contrôle. S'appuyer sur des crochets dans ce contexte est une cartographie mentale que chaque développeur de l'équipe doit connaître.
  2. Quitter le programme "normalement" fournira le même code de sortie au système d'exploitation que System.exit (0). Donc c'est redondant. Si votre programme ne peut pas quitter "normalement", votre développement est hors de contrôle. Vous devriez toujours avoir le contrôle total de l'état du système.
  3. Vous masquez les problèmes de programmation tels que l'exécution de threads qui ne sont pas arrêtés normalement.
  4. Cela fait référence à 3: Vous pouvez rencontrer un état d'application inconstant qui interrompt les threads anormalement.

En passant: Le renvoi d'autres codes de retour à 0 a un sens si vous voulez indiquer une fin de programme anormale.




Bien que la réponse était vraiment utile, mais certains ont manqué quelques détails supplémentaires. J'espère que ci-dessous aidera à comprendre le processus d'arrêt en Java, en plus de la réponse ci-dessus:

  1. Lors d'une fermeture ordonnée *, la JVM démarre d'abord tous les hooks d'arrêt enregistrés. Les hooks d'arrêt sont des threads non démarrés qui sont enregistrés avec Runtime.addShutdownHook.
  2. JVM ne donne aucune garantie sur l'ordre dans lequel les hooks d'arrêt sont démarrés. Si des threads d'application (daemon ou nondaemon) sont toujours en cours d'exécution à l'arrêt, ils continuent de s'exécuter simultanément avec le processus d'arrêt .
  3. Lorsque tous les hooks d'arrêt sont terminés, la JVM peut choisir d'exécuter les finaliseurs si runFinalizersOnExit a la valeur true, puis s'arrête.
  4. JVM ne tente pas d'arrêter ou d'interrompre les threads d'application qui sont toujours en cours d'exécution au moment de l'arrêt; ils sont brusquement terminés quand la JVM finit par s'arrêter.
  5. Si les crochets d'arrêt ou les finaliseurs ne se terminent pas, le processus d'arrêt ordonné "se bloque" et la JVM doit être arrêtée brusquement.
  6. Dans un arrêt brusque, la JVM n'est pas obligée de faire autre chose que de stopper la JVM; les crochets d'arrêt ne fonctionneront pas.

PS: La JVM peut s'arrêter de manière ordonnée ou abrupte .

  1. Une fermeture ordonnée est déclenchée lorsque le dernier thread "normal" (non-démon) se termine, quelqu'un appelle System.exit, ou par d'autres moyens spécifiques à la plate-forme (comme envoyer un SIGINT ou appuyer sur Ctrl-C).
  2. Tandis que ci-dessus est le moyen standard et préféré pour arrêter la JVM, il peut également être arrêté brutalement en appelant Runtime.halt ou en supprimant le processus JVM via le système d'exploitation (comme l'envoi d'un SIGKILL).



Related

java exit

Tags

java   exit