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

1. Oversikt

I denne opplæringen vil vi se på System.exit (), Runtime.getRuntime (). Stopp (), og hvordan disse to metodene kan sammenlignes med hverandre.

2. System.exit ()

De System.exit () metode stopper den kjørende Java Virtual Machine. Men før du stopper JVM, det kaller avstengningssekvensen, også kjent som en ordnet nedleggelse. Se denne artikkelen for å lære mer om å legge til kroker.

Avstengningssekvensen til JVM påkaller først alle registrerte stengekroker og venter på at de skal fullføres. Deretter kjører den alle uoppfordrede sluttbehandlere hvis sluttføring ved utgang Er på. Endelig stopper det JVM.

Denne metoden kaller faktisk Runtime.getRuntime (). Exit () metode internt. Det tar et heltall statuskode som argument og har en tomrom returtype:

offentlig statisk tomromutgang (int-status)

Hvis statuskoden ikke er null, indikerer det at programmet stoppet unormalt.

3. Runtime.getRuntime (). Stopp ()

De Kjøretid klasse lar et program samhandle med miljøet programmet kjører i.

Den har en stopp metode som kan brukes til med makt avslutte den kjørende JVM.

i motsetning til exit metode, utløser ikke denne metoden JVM-avslutningssekvensen. Derfor, ingen lukkekrokene eller sluttbehandlerne blir utført når vi kaller stopp metode.

Denne metoden er ikke-statisk og har en lignende signatur som System.exit ():

offentlig tomromstopp (int-status)

Lik exit, indikerer statuskoden som ikke er null i denne metoden også unormal avslutning av programmet.

4. Eksempel

La oss nå se et eksempel på exit og stopp metoder, ved hjelp av en stengekrok.

For å holde det enkelt, oppretter vi en Java-klasse og registrerer en stengekrok i en statisk blokkere. Vi vil også lage to metoder; den første kaller exit metoden og den andre kaller stopp metode:

offentlig klasse JvmExitAndHaltDemo {privat statisk logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); statisk {Runtime.getRuntime () .addShutdownHook (ny tråd (() -> {LOGGER.info ("Shutdown hook initiated.");})); } public void processAndExit () {process (); LOGGER.info ("Calling System.exit ()."); System.exit (0); } public void processAndHalt () {process (); LOGGER.info ("Calling Runtime.getRuntime (). Halt ()."); Runtime.getRuntime (). Stopp (0); } privat ugyldig prosess () {LOGGER.info ("Prosessen startet."); }}

Så, for å teste utgangsmetoden først, la oss lage en testtilfelle:

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

La oss nå kjøre testsaken og se at avstengningskroken heter:

12: 48: 43.156 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Prosessen 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 - Avstengningskrok startet.

På samme måte oppretter vi en testsak for stopp metode:

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

Nå kan vi også kjøre denne testsaken og se at avstengningskroken ikke heter:

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

5. Når du skal bruke exit og stopp

Som vi har sett tidligere, System.exit () metoden utløser avstengningssekvensen til JVM, mens Runtime.getRuntime (). Stopp () avslutter JVM brått.

Vi kan også gjøre dette ved å bruke operativsystemkommandoer. For eksempel kan vi bruke SIGINT eller Ctrl + C for å utløse ordnet nedleggelse som System.exit () og SIGKILL for å drepe JVM-prosessen brått.

Derfor trenger vi sjelden å bruke disse metodene. Når det er sagt, må vi kanskje bruke exit metode når vi trenger JVM for å kjøre de registrerte avstengningskrokene eller returnere en bestemt statuskode til den som ringer, som med et skallskript.

Det er imidlertid viktig å merke seg at stengekroken kan føre til en fastlåst tilstand, hvis den ikke er utformet riktig. Følgelig ble den exit metoden kan bli blokkert mens den venter til de registrerte stengekrokene er ferdige. Så, en mulig måte å ta vare på dette er å bruke stopp metode for å tvinge JVM til å stanse, i tilfelle exit blokker.

Til slutt kan et program også begrense disse metodene fra utilsiktet bruk. Begge disse metodene kaller sjekk Avslutt metoden for Sikkerhetssjef klasse. Så, til ikke tillate exit og stopp operasjoner, kan et program opprette en sikkerhetspolicy ved hjelp av Sikkerhetssjef klasse og kaste SecurityException fra sjekk Avslutt metode.

6. Konklusjon

I denne opplæringen har vi sett på System.exit () og Runtime.getRuntime (). Stopp () metoder ved hjelp av et eksempel. Videre har vi også snakket om bruken og beste praksis for disse metodene.

Som vanlig er den fullstendige kildekoden til denne artikkelen tilgjengelig på Github.


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