Runtime.getRuntime (). Halt () vs System.exit () Java-ban

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk System.exit (), Runtime.getRuntime (). Halt (), és hogy ez a két módszer hogyan viszonyul egymáshoz.

2. System.exit ()

A System.exit () módszer leállítja a futó Java virtuális gépet. De a JVM leállítása előtt meg kell meghívja a leállítási sorrendet, más néven rendezett leállítás. Kérjük, olvassa el ezt a cikket, ha többet szeretne megtudni a leállító kampók hozzáadásáról.

A JVM leállítási sorrendje először meghívja az összes regisztrált leállító kampót és megvárja, amíg befejeződik. Ezután az összes hívatlan véglegesítőt futtatja, ha véglegesítés-kilépéskor engedélyezve. Végül leállítja a JVM-et.

Ez a módszer valójában a Runtime.getRuntime (). Exit () módszer belsőleg. Ez egy egész állapotkódot vesz fel argumentumként, és rendelkezik egy üres visszatérési típus:

nyilvános statikus üresség kilépés (int állapot)

Ha az állapotkód nem nulla, az azt jelzi, hogy a program rendellenesen leállt.

3. Runtime.getRuntime (). Halt ()

A Futásidő osztály lehetővé teszi egy alkalmazás számára, hogy kölcsönhatásba lépjen azzal a környezettel, amelyben az alkalmazás fut.

Van egy Állj használható módszer erőszakosan szüntesse meg a futó JVM-et.

ellentétben a kijárat módszerrel, ez a módszer nem indítja el a JVM leállítási sorrendjét. Ebből kifolyólag, se a leállítási kampókat vagy a véglegesítőket végrehajtják amikor felhívjuk a Állj módszer.

Ez a módszer nem statikus, és hasonló aláírással rendelkezik System.exit ():

public void halt (int állapot)

Hasonló kijárat, a nulla állapot nélküli kód ebben a módszerben a program rendellenes befejezését is jelzi.

4. Példa

Most nézzünk meg egy példát kijárat és Állj módszereket, egy leállító kampó segítségével.

Az egyszerűség kedvéért létrehozunk egy Java osztályt, és regisztrálunk egy leállítási kampót a statikus Blokk. Két módszert is létrehozunk; az első hívja a kijárat metódust, a második pedig a Állj módszer:

public class JvmExitAndHaltDemo {private static Logger LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); statikus {Runtime.getRuntime () .addShutdownHook (új szál (() -> {LOGGER.info ("Leállítási kampó elindítva.");})); } public void processAndExit () {process (); LOGGER.info ("Calling System.exit ()."); System.exit (0); } public void processAndHalt () {process (); LOGGER.info ("Runtime.getRuntime (). Halt (). Hívása"); Runtime.getRuntime (). Halt (0); } private void process () {LOGGER.info ("A folyamat elindult."); }}

Tehát, hogy először teszteljük a kilépési módszert, hozzunk létre egy tesztesetet:

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

Futtassuk most a tesztesetet, és nézzük meg, hogy a leállítási kampó neve:

12: 48: 43.156 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - A folyamat elindult. 12: 48: 43.159 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Calling System.exit (). 12: 48: 43.160 [Thread-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Leállítási kampó elindítva.

Hasonlóképpen létrehozunk egy tesztesetet a Állj módszer:

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

Most már futtathatjuk ezt a tesztesetet is, és láthatjuk, hogy a leállítási kampót nem hívják:

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

5. Mikor kell használni kijárat és Állj

Mint korábban láthattuk, a System.exit () metódus váltja ki a JVM leállítási sorrendjét, míg a Runtime.getRuntime (). Halt () hirtelen megszünteti a JVM-et.

Megtehetjük ezt az operációs rendszer parancsainak használatával is. Például használhatjuk a SIGINT vagy a Ctrl + C billentyűkombinációt a rendezett leállítás kiváltására System.exit () és SIGKILL, hogy hirtelen megölje a JVM folyamatát.

Ezért ritkán kell alkalmaznunk ezeket a módszereket. Ezt követően szükség lehet a kijárat módszer, amikor szükségünk van a JVM-re a regisztrált leállítási kampók futtatásához vagy egy adott állapotkód visszaadásához a hívónak, például egy shell szkript használatával.

Fontos azonban megjegyezni, hogy a leállító kampó holtpontot okozhat, ha nem megfelelően alakítják ki. Következésképpen a kijárat módszer blokkolható amint megvárja, amíg a regisztrált leállító kampók befejeződnek. Tehát a gondozás egyik lehetséges módja a Állj módszer arra, hogy a JVM-et megállásra kényszerítsék kijárat blokkok.

Végül egy alkalmazás korlátozhatja ezeket a módszereket a véletlenszerű használatból is. Mindkét módszer a checkExit módszere SecurityManager osztály. Tehát tiltsa le a kijárat és Állj tevékenységek, egy alkalmazás létrehozhat egy biztonsági házirendet a SecurityManager osztály és dobja a SecurityException tól checkExit módszer.

6. Következtetés

Ebben az oktatóanyagban megvizsgáltuk a System.exit () és Runtime.getRuntime (). Halt () módszerek egy példa segítségével. Ezenfelül beszéltünk e módszerek használatáról és a bevált gyakorlatokról is.

Szokás szerint a cikk teljes forráskódja elérhető a Github oldalon.