Runtime.getRuntime (). Stop () vs System.exit () i Java

1. Oversigt

I denne vejledning ser vi på System.exit (), Runtime.getRuntime (). Stop (), og hvordan disse to metoder sammenlignes med hinanden.

2. System.exit ()

Det System.exit () metode stopper den kørende Java Virtual Machine. Men inden du stopper JVM, det kalder nedlukningssekvensen, også kendt som en ordnet nedlukning. Se denne artikel for at lære mere om tilføjelse af lukningskrog.

Lukningssekvensen for JVM påkalder først alle registrerede lukningskroge og venter på, at de er færdige. Derefter kører det alle uindkaldte slutbehandlere, hvis afslutning ved udgang er aktiveret. Endelig stopper det JVM.

Denne metode kalder faktisk Runtime.getRuntime (). Exit () metode internt. Det tager et heltal statuskode som et argument og har et ugyldig returtype:

offentlig statisk ugyldig udgang (int-status)

Hvis statuskoden ikke er nul, betyder det, at programmet stoppede unormalt.

3. Runtime.getRuntime (). Stop ()

Det Kørselstid klasse tillader et program at interagere med det miljø, hvor applikationen kører.

Den har en standse metode, der kan bruges til med magt afslutte den kørende JVM.

I modsætning til Afslut metode, udløser denne metode ikke JVM-nedlukningssekvensen. Derfor, ingen af ​​dem nedlukningskrogene eller finalisatorerne udføres når vi kalder standse metode.

Denne metode er ikke-statisk og har en signatur, der ligner System.exit ():

offentlig ugyldig standsning (int-status)

Svarende til Afslut, statuskoden, der ikke er nul, i denne metode angiver også unormal afslutning af programmet.

4. Eksempel

Lad os nu se et eksempel på Afslut og standse metoder ved hjælp af en lukningskrog.

For at holde det enkelt opretter vi en Java-klasse og registrerer en nedlukningskrog i en statisk blok. Vi opretter også to metoder; den første kalder Afslut metode og det andet kalder standse metode:

offentlig klasse JvmExitAndHaltDemo {privat statisk logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); statisk {Runtime.getRuntime () .addShutdownHook (ny tråd (() -> {LOGGER.info ("Nedlukningskrog startet.");})); } public void processAndExit () {process (); LOGGER.info ("Calling System.exit ()."); System.exit (0); } offentlig ugyldig procesAndHalt () {proces (); LOGGER.info ("Calling Runtime.getRuntime (). Stop ()."); Runtime.getRuntime (). Stop (0); } privat ugyldig proces () {LOGGER.info ("Processen startet."); }}

Så for at teste exitmetoden først, lad os oprette en test case:

@Test offentlig ugyldighed givenProcessComplete_whenExitCalled_thenTriggerShutdownHook () {jvmExitAndHaltDemo.processAndExit (); }

Lad os nu køre testkassen og se, at lukningskrogen kaldes:

12: 48: 43.156 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Processen startet. 12: 48: 43.159 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Calling System.exit (). 12: 48: 43.160 [Tråd-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Nedlukningskrog startet.

Tilsvarende opretter vi en test sag til standse metode:

@Test offentlig ugyldighed givenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook () {jvmExitAndHaltDemo.processAndHalt (); }

Nu kan vi også køre denne test sag og se, at lukningskrogen ikke kaldes:

12: 49: 16.839 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Processen startet. 12: 49: 16.842 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Calling Runtime.getRuntime (). Halt ().

5. Hvornår skal du bruge det? Afslut og standse

Som vi har set tidligere, System.exit () metode udløser lukningssekvensen for JVM, hvorimod Runtime.getRuntime (). Stop () afslutter JVM brat.

Vi kan også gøre dette ved hjælp af operativsystemkommandoer. For eksempel kan vi bruge SIGINT eller Ctrl + C til at udløse den ordnede nedlukning som System.exit () og SIGKILL for at dræbe JVM-processen brat.

Derfor har vi sjældent brug for disse metoder. Når det er sagt, skal vi muligvis bruge Afslut metode, når vi har brug for JVM til at køre de registrerede lukningskroge eller returnere en bestemt statuskode til den, der ringer op, som med et shell-script.

Det er dog vigtigt at bemærke, at nedlukningskrogen kan forårsage en blokering, hvis den ikke er designet korrekt. Derfor er den Afslut metode kan blive blokeret mens den venter, indtil de registrerede lukningskroge er færdige. Så en mulig måde at tage sig af dette er at bruge standse metode til at tvinge JVM til at standse, i tilfælde af Afslut blokke.

Endelig kan en applikation også begrænse disse metoder fra utilsigtet brug. Begge disse metoder kalder checkExit metode til SecurityManager klasse. Så til ikke tillade Afslut og standse operationer, kan en applikation oprette en sikkerhedspolitik ved hjælp af SecurityManager klasse og smide Sikkerhedsundtagelse fra checkExit metode.

6. Konklusion

I denne vejledning har vi undersøgt System.exit () og Runtime.getRuntime (). Stop () metoder ved hjælp af et eksempel. Desuden har vi også talt om brugen og bedste praksis for disse metoder.

Som sædvanlig er den komplette kildekode til denne artikel tilgængelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found