Runtime.getRuntime (). Halt () vs System.exit () u Javi

1. Pregled

U ovom uputstvu ćemo pogledati System.exit (), Runtime.getRuntime (). Halt ()i kako se ove dvije metode međusobno uspoređuju.

2. System.exit ()

The System.exit () metoda zaustavlja pokrenuti Java Virtual Machine. Ali, prije zaustavljanja JVM-a, to poziva niz zaustavljanja, poznato i kao uredno gašenje. Pogledajte ovaj članak da biste saznali više o dodavanju kuka za isključivanje.

Slijed isključivanja JVM prvo poziva sve registrirane kuke za isključivanje i čeka da ih završe. Zatim pokreće sve nepozvane finalizatore ako finalizacija-na-izlazu je omogućen. Napokon, zaustavlja JVM.

Ova metoda, zapravo, naziva Runtime.getRuntime (). Exit () metoda interno. Kao argument uzima cjelobrojni statusni kod i ima znak poništiti tip povrata:

javni statički prazan izlaz (int status)

Ako statusni kôd nije nula, to znači da se program neobično zaustavio.

3. Runtime.getRuntime (). Halt ()

The Vrijeme izvođenja klasa omogućuje aplikaciji interakciju s okolinom u kojoj se aplikacija izvodi.

Ono ima zaustaviti metoda koja se može koristiti za prisilno prekinuti pokrenut JVM.

Za razliku od Izlaz metoda, ova metoda ne pokreće JVM sekvencu isključivanja. Stoga, ni izvršavaju se kuke za isključivanje ili finalizatori kad nazovemo zaustaviti metoda.

Ova metoda je nestatična i ima sličan potpis System.exit ():

zaustavljanje javne praznine (int status)

Slično Izlaz, ne-nulti statusni kod u ovoj metodi također ukazuje na abnormalni prekid programa.

4. Primjer

Sada, da vidimo primjer Izlaz i zaustaviti metode, uz pomoć kuke za isključivanje.

Da bi bilo jednostavnije, stvorit ćemo Java klasu i registrirati zaustavljanje u a statički blok. Također ćemo stvoriti dvije metode; prvi poziva Izlaz metoda, a druga poziva zaustaviti metoda:

javna klasa JvmExitAndHaltDemo {private static Logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); static {Runtime.getRuntime () .addShutdownHook (new Thread (() -> {LOGGER.info ("Inicijativa za isključivanje pokrenuta.");})); } javna void processAndExit () {process (); LOGGER.info ("Pozivanje System.exit ()."); System.exit (0); } javna praznina processAndHalt () {process (); LOGGER.info ("Pozivanje Runtime.getRuntime (). Halt ()."); Runtime.getRuntime (). Halt (0); } privatni void postupak () {LOGGER.info ("Proces je započet."); }}

Dakle, da prvo testiramo izlaznu metodu, kreirajmo test slučaj:

@Test javna praznina givenProcessComplete_whenExitCalled_thenTriggerShutdownHook () {jvmExitAndHaltDemo.processAndExit (); }

Pokrenimo sada test slučaj i vidimo da se zove kuka za isključivanje:

12: 48: 43.156 [glavna] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Proces je pokrenut. 12: 48: 43.159 [glavna] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Pozivanje System.exit (). 12: 48: 43.160 [Tema-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Pokrenuta kuka za isključivanje.

Slično tome, stvorit ćemo test za zaustaviti metoda:

@Test javna praznina givenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook () {jvmExitAndHaltDemo.processAndHalt (); }

Sada možemo pokrenuti i ovaj testni slučaj i vidjeti da se kuka za isključivanje ne zove:

12: 49: 16.839 [glavna] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Proces je pokrenut. 12: 49: 16.842 [glavna] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Pozivanje Runtime.getRuntime (). Halt ().

5. Kada koristiti Izlaz i zaustaviti

Kao što smo vidjeli ranije, System.exit () metoda pokreće sekvencu isključivanja JVM-a, dok Runtime.getRuntime (). Halt () naglo prekida JVM.

To također možemo učiniti pomoću naredbi operativnog sustava. Na primjer, možemo upotrijebiti SIGINT ili Ctrl + C za pokretanje urednog isključivanja poput System.exit () i SIGKILL da naglo ubiju JVM postupak.

Stoga rijetko trebamo koristiti ove metode. Kad smo to već rekli, možda ćemo trebati koristiti Izlaz metoda kada nam treba JVM za pokretanje registriranih kuka za isključivanje ili vraćanje određenog statusnog koda pozivatelju, poput skripte ljuske.

Međutim, važno je napomenuti da kuka za isključivanje može uzrokovati zastoj ako nije pravilno dizajnirana. Slijedom toga, Izlaz metoda može biti blokirana dok čeka dok registrirane kuke za isključivanje ne završe. Dakle, mogući način da se pobrinemo za to je korištenje zaustaviti metoda kojom se JVM mora zaustaviti, u slučaju Izlaz blokovi.

Napokon, aplikacija također može ograničiti ove metode od slučajne uporabe. Obje ove metode pozivaju checkExit metoda SecurityManager razred. Dakle, do zabraniti Izlaz i zaustaviti operacijama, aplikacija može stvoriti sigurnosnu politiku pomoću SecurityManager razred i baci SecurityException od checkExit metoda.

6. Zaključak

U ovom smo tutorijalu pogledali System.exit () i Runtime.getRuntime (). Halt () metode uz pomoć primjera. Štoviše, razgovarali smo i o upotrebi i najboljim praksama ovih metoda.

Kao i obično, cjeloviti izvorni kod ovog članka dostupan je na Githubu.


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