Runtime.getRuntime (). Halt () versus System.exit () in Java

1. Overzicht

In deze tutorial zullen we kijken naar System.exit (), Runtime.getRuntime (). Halt (), en hoe deze twee methoden zich met elkaar verhouden.

2. System.exit ()

De System.exit () methode stopt de actieve Java Virtual Machine. Maar voordat de JVM wordt gestopt, it roept de uitschakelsequentie op, ook wel bekend als een ordelijke uitschakeling. Raadpleeg dit artikel voor meer informatie over het toevoegen van shutdown-hooks.

De afsluitsequentie van JVM roept eerst alle geregistreerde afsluitingshaken aan en wacht tot ze zijn voltooid. Vervolgens worden alle niet-opgeroepen finalizers uitgevoerd als afronding bij het verlaten is ingeschakeld. Ten slotte stopt het de JVM.

Deze methode roept in feite de Runtime.getRuntime (). Exit () methode intern. Het heeft een integer statuscode als argument nodig en heeft een leegte retourtype:

openbare statische leegte uitgang (int status)

Als de statuscode niet nul is, geeft dit aan dat het programma abnormaal is gestopt.

3. Runtime.getRuntime (). Halt ()

De Looptijd class stelt een applicatie in staat om te communiceren met de omgeving waarin de applicatie wordt uitgevoerd.

Het heeft een stoppen methode die kan worden gebruikt om de actieve JVM met geweld beëindigen.

In tegenstelling tot de Uitgang methode, activeert deze methode niet de JVM-afsluitsequentie. Daarom geen van beide de shutdown hooks of de finalizers worden uitgevoerd wanneer we de stoppen methode.

Deze methode is niet-statisch en heeft een vergelijkbare handtekening als System.exit ():

openbare leegte halt (int status)

Gelijkwaardig aan Uitganggeeft de niet-nul statuscode in deze methode ook een abnormale beëindiging van het programma aan.

4. Voorbeeld

Laten we nu een voorbeeld bekijken van Uitgang en stoppen methoden, met behulp van een shutdown-hook.

Om het simpel te houden, maken we een Java-klasse en registreren we een shutdown-hook in een statisch blok. We zullen ook twee methoden maken; de eerste noemt de Uitgang methode en de tweede roept de stoppen methode:

openbare klasse JvmExitAndHaltDemo {privé statische logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); statische {Runtime.getRuntime () .addShutdownHook (nieuwe Thread (() -> {LOGGER.info ("Shutdown hook geïnitieerd.");})); } openbare ongeldige processAndExit () {process (); LOGGER.info ("Calling System.exit ()."); System.exit (0); } openbare ongeldige processAndHalt () {process (); LOGGER.info ("Runtime.getRuntime (). Halt ()."); Runtime.getRuntime (). Halt (0); } private void process () {LOGGER.info ("Proces gestart."); }}

Laten we dus eerst een testcase maken om de exit-methode te testen:

@Test openbare ongeldig gegevenProcessComplete_whenExitCalled_thenTriggerShutdownHook () {jvmExitAndHaltDemo.processAndExit (); }

Laten we nu de testcase uitvoeren en zien dat de shutdown-hook wordt genoemd:

12: 48: 43.156 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Proces gestart. 12: 48: 43.159 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Calling System.exit (). 12: 48: 43.160 [Thread-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Shutdown hook geïnitieerd.

Op dezelfde manier maken we een testcase voor de stoppen methode:

@Test openbare ongeldig gegevenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook () {jvmExitAndHaltDemo.processAndHalt (); }

Nu kunnen we deze testcase ook uitvoeren en zien dat de shutdown-hook niet wordt aangeroepen:

12: 49: 16.839 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Proces gestart. 12: 49: 16.842 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Runtime.getRuntime (). Halt () aanroepen.

5. Wanneer te gebruiken Uitgang en stoppen

Zoals we eerder hebben gezien, is de System.exit () methode activeert de afsluitsequentie van JVM, terwijl de Runtime.getRuntime (). Halt () beëindigt de JVM abrupt.

We kunnen dit ook doen door commando's van het besturingssysteem te gebruiken. We kunnen bijvoorbeeld SIGINT of Ctrl + C gebruiken om de ordelijke uitschakeling te activeren, zoals System.exit () en SIGKILL om het JVM-proces abrupt te beëindigen.

Daarom hoeven we deze methoden zelden te gebruiken. Dat gezegd hebbende, moeten we mogelijk de Uitgang methode wanneer we de JVM nodig hebben om de geregistreerde shutdown-hooks uit te voeren of een specifieke statuscode naar de beller terug te sturen, zoals met een shell-script.

Het is echter belangrijk op te merken dat de uitschakelhaak een impasse kan veroorzaken als deze niet goed is ontworpen. Bijgevolg is het Uitgang methode kan worden geblokkeerd terwijl het wacht tot de geregistreerde shutdown-hooks zijn voltooid. Een mogelijke manier om hier voor te zorgen, is door de stoppen methode om JVM te dwingen te stoppen, voor het geval dat Uitgang blokken.

Ten slotte kan een toepassing ook voorkomen dat deze methoden per ongeluk worden gebruikt. Beide methoden noemen het checkExit methode van de Beveiligingsmanager klasse. Dus, naar niet toestaan Uitgang en stoppen operatieskan een toepassing een beveiligingsbeleid maken met behulp van de Beveiligingsmanager klasse en gooi de Beveiligingsuitzondering van de checkExit methode.

6. Conclusie

In deze zelfstudie hebben we gekeken naar de System.exit () en Runtime.getRuntime (). Halt () methoden met behulp van een voorbeeld. Bovendien hebben we het ook gehad over het gebruik en de beste praktijken van deze methoden.

Zoals gewoonlijk is de volledige broncode van dit artikel beschikbaar op Github.