Runtime.getRuntime (). Halt () vs System.exit () v Jave

1. Prehľad

V tejto príručke sa pozrieme na to System.exit (), Runtime.getRuntime (). Halt ()a ako sa tieto dve metódy navzájom porovnávajú.

2. System.exit ()

The System.exit () metóda zastaví spustený Java Virtual Machine. Pred zastavením JVM to však bolo volá sekvenciu vypínania, známe tiež ako riadené vypnutie. V tomto článku nájdete ďalšie informácie o pridávaní vypínacích hákov.

Sekvencia vypínania JVM najskôr vyvolá všetky zaregistrované vypínacie háky a čaká na ich dokončenie. Potom spustí všetky nevyvolané finalizátory, ak finalizácia-na-výstupe je umožnené. Nakoniec to zastaví JVM.

Táto metóda v skutočnosti nazýva Runtime.getRuntime (). Exit () metóda interne. Berie celočíselný stavový kód ako argument a má a neplatný návratový typ:

verejné statické ukončenie neplatnosti (stav int)

Ak je stavový kód nenulový, znamená to, že sa program neobvykle zastavil.

3. Runtime.getRuntime (). Halt ()

The Beh programu trieda umožňuje aplikácii komunikovať s prostredím, v ktorom je spustená.

zastaviť metóda, na ktorú sa dá zvyknúť násilne ukončiť bežiaci JVM.

Na rozdiel od východ táto metóda nespustí postupnosť vypínania JVM. Preto ani jedno vykonajú sa uzatváracie háky alebo finalizátory keď voláme zastaviť metóda.

Táto metóda je nestatická a má podobný podpis ako System.exit ():

zastavenie neplatnosti verejnosti (stav int)

Podobný východ, nenulový stavový kód v tejto metóde tiež naznačuje abnormálne ukončenie programu.

4. Príklad

Teraz sa pozrime na príklad východ a zastaviť metódami pomocou vypínacieho háku.

Pre zjednodušenie vytvoríme triedu Java a zaregistrujeme vypínací hák v statický blokovať. Vytvoríme tiež dve metódy; prvý volá východ metóda a druhá volá zastaviť metóda:

public class JvmExitAndHaltDemo {private static Logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); static {Runtime.getRuntime () .addShutdownHook (nové vlákno (() -> {LOGGER.info ("iniciované vypnutie spojenia.");}))); } public void processAndExit () {process (); LOGGER.info ("Volanie System.exit ()."); System.exit (0); } public void processAndHalt () {process (); LOGGER.info ("Volanie Runtime.getRuntime (). Halt ()."); Runtime.getRuntime (). Halt (0); } private void process () {LOGGER.info ("Proces bol spustený."); }}

Aby sme teda najskôr otestovali metódu ukončenia, vytvorme si testovací prípad:

@Test public void givenProcessComplete_whenExitCalled_thenTriggerShutdownHook () {jvmExitAndHaltDemo.processAndExit (); }

Poďme teraz spustiť testovací prípad a uvidíme, že sa volá vypínací hák:

12: 48: 43.156 [hlavné] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - proces bol spustený. 12: 48: 43.159 [hlavné] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - volanie System.exit (). 12: 48: 43.160 [Thread-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - bol spustený háčik vypnutia.

Podobne vytvoríme testovací prípad pre zastaviť metóda:

@Test public void givenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook () {jvmExitAndHaltDemo.processAndHalt (); }

Teraz môžeme spustiť aj tento testovací prípad a zistiť, že sa nezavolá vypínací hák:

12: 49: 16.839 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Proces bol spustený. 12: 49: 16.842 [hlavné] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - volanie Runtime.getRuntime (). Halt ().

5. Kedy použiť východ a zastaviť

Ako sme už videli skôr, System.exit () metóda spúšťa postupnosť vypínania JVM, zatiaľ čo Runtime.getRuntime (). Halt () náhle ukončí JVM.

Môžeme to urobiť aj pomocou príkazov operačného systému. Napríklad môžeme použiť SIGINT alebo Ctrl + C na spustenie usporiadaného vypínania System.exit () a SIGKILL, aby náhle zabili proces JVM.

Preto tieto metódy používame len zriedka. Z tohto dôvodu bude možno potrebné použiť východ metóda, keď potrebujeme, aby JVM spustil registrované vypínacie háky alebo vrátil volajúcemu konkrétny stavový kód, napríklad pomocou skriptu shell.

Je však dôležité poznamenať, že vypínací hák môže spôsobiť zablokovanie, ak nie je správne navrhnutý. V dôsledku toho východ metóda môže byť zablokovaná ako počká, kým skončia registrované vypínacie háky. Možným spôsobom, ako sa o to postarať, je použitie zastaviť metóda prinútiť JVM zastaviť sa v prípade východ blokov.

Aplikácia môže nakoniec tiež obmedziť tieto metódy pred náhodným použitím. Obe tieto metódy nazývajú checkExit metóda SecurityManager trieda. Takže zakázať východ a zastaviť operácie, môže aplikácia vytvoriť bezpečnostnú politiku pomocou SecurityManager triedy a hodiť Výnimka zabezpečenia z checkExit metóda.

6. Záver

V tomto návode sme sa pozreli na System.exit () a Runtime.getRuntime (). Halt () metódy pomocou príkladu. Okrem toho sme hovorili aj o použití a osvedčených postupoch týchto metód.

Úplný zdrojový kód tohto článku je ako obvykle k dispozícii na serveri Github.