Runtime.getRuntime (). עצור () לעומת System.exit () ב- Java

1. סקירה כללית

במדריך זה נבדוק System.exit (), Runtime.getRuntime (). עצור (), וכיצד שתי שיטות אלה משתוות זו עם זו.

2. System.exit ()

ה System.exit () שיטה עוצר את מכונת ה- Java Virtual Java הפועלת. אבל לפני שתפסיק את ה- JVM, זה קורא לרצף הכיבוי, המכונה גם כיבוי מסודר. אנא עיין במאמר זה למידע נוסף על הוספת ווים לכיבוי.

רצף הכיבוי של JVM מפעיל תחילה את כל ווי הכיבוי הרשומים ומחכה להשלמתם. לאחר מכן, הוא מריץ את כל המסיימים שלא גויסו אם סיום-ביציאה מופעלת. לבסוף, הוא עוצר את ה- JVM.

שיטה זו, למעשה, מכנה את Runtime.getRuntime (). יציאה () שיטה פנימית. זה לוקח קוד סטטוס שלם כארגומנט ויש לו בָּטֵל סוג החזרה:

יציאה בטלה סטטית ציבורית (סטטוס int)

אם קוד הסטטוס אינו אפס, זה מציין שהתוכנית נעצרה באופן חריג.

3. Runtime.getRuntime (). עצור ()

ה זמן ריצה class מאפשר ליישום לקיים אינטראקציה עם הסביבה בה היישום פועל.

יש לזה לַעֲצוֹר שיטה שאפשר להשתמש בה לסיים בכוח את ה- JVM הפועל.

לא כמו ה יְצִיאָה בשיטה, שיטה זו אינה מפעילה את רצף הכיבוי של JVM. לָכֵן, לא זה ולא זה את וו הכיבוי או את מסיימי הגמר מבוצעים כשאנחנו קוראים לַעֲצוֹר שיטה.

שיטה זו אינה סטטית ויש לה חתימה דומה לזו System.exit ():

עצירה בטלנית ציבורית (סטטוס int)

דומה ל יְצִיאָה, קוד המצב שאינו אפס בשיטה זו מציין גם סיום חריג של התוכנית.

4. דוגמא

עכשיו, בואו נראה דוגמה ל יְצִיאָה ו לַעֲצוֹר שיטות, בעזרת וו כיבוי.

כדי לשמור על הפשטות, ניצור מחלקת Java ונרשום וו כיבוי ב- סטָטִי לַחסוֹם. כמו כן, ניצור שתי שיטות; הראשון קורא יְצִיאָה והשיטה השנייה קוראת לַעֲצוֹר שיטה:

מחלקה ציבורית JvmExitAndHaltDemo {לוגר סטטי פרטי LOGGER = LoggerFactory.getLogger (JvmExitAndHaltDemo.class); סטטי {Runtime.getRuntime () .addShutdownHook (אשכול חדש (() -> {LOGGER.info ("וו כיבוי יזם.");})); } חלל ציבורי processAndExit () {process (); LOGGER.info ("Calling System.exit ()."); System.exit (0); } חלל ציבורי processAndHalt () {process (); LOGGER.info ("קורא Runtime.getRuntime (). עצור ()."); Runtime.getRuntime (). עצור (0); } תהליך ריק ריק () {LOGGER.info ("התהליך התחיל."); }}

לכן, כדי לבדוק תחילה את שיטת היציאה, בואו ליצור מקרה מבחן:

@Test הציבור בטל givenProcessComplete_whenExitCalled_thenTriggerShutdownHook () {jvmExitAndHaltDemo.processAndExit (); }

בואו נפעיל את מקרה הבדיקה ונראה כי וו הכיבוי נקרא:

12: 48: 43.156 [main] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - התהליך התחיל. 12: 48: 43.159 [ראשי] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - Calling System.exit (). 12: 48: 43.160 [Thread-0] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - וו כיבוי יזם.

באופן דומה, ניצור מקרה מבחן עבור ה- לַעֲצוֹר שיטה:

@Test הציבור בטל givenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook () {jvmExitAndHaltDemo.processAndHalt (); }

כעת, אנו יכולים להריץ גם את מקרה הבדיקה ולראות שלא נקרא וו הכיבוי:

12: 49: 16.839 [ראשי] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - התהליך התחיל. 12: 49: 16.842 [ראשי] INFO com.baeldung.exitvshalt.JvmExitAndHaltDemo - קורא Runtime.getRuntime (). עצור ().

5. מתי להשתמש יְצִיאָה ו לַעֲצוֹר

כפי שראינו קודם, System.exit () השיטה מפעילה את רצף הכיבוי של JVM, ואילו ה- Runtime.getRuntime (). עצור () מסיים את ה- JVM בפתאומיות.

אנו יכולים לעשות זאת גם באמצעות פקודות של מערכת ההפעלה. לדוגמה, אנו יכולים להשתמש ב- SIGINT או Ctrl + C כדי להפעיל את הכיבוי המסודר כמו System.exit () ו- SIGKILL להרוג את תהליך ה- JVM בפתאומיות.

לכן, לעתים רחוקות אנו זקוקים להשתמש בשיטות אלה. עם זאת, ייתכן שנצטרך להשתמש ב- יְצִיאָה שיטה כאשר אנו זקוקים ל- JVM כדי להפעיל את ווים הכיבוי הרשומים או להחזיר קוד מצב ספציפי למתקשר, כמו עם סקריפט מעטפת.

עם זאת, חשוב לציין כי וו הכיבוי עלול לגרום למבוי סתום, אם אינו מתוכנן כהלכה. כתוצאה מכך, יְצִיאָה השיטה יכולה להיחסם כשהוא ממתין עד לסיום ווי הכיבוי הרשומים. לכן, דרך אפשרית לטפל בכך היא להשתמש ב- לַעֲצוֹר שיטה לאלץ JVM להפסיק, למקרה יְצִיאָה חסימות.

לבסוף, יישום יכול גם להגביל שיטות אלה לשימוש מקרי. שתי השיטות הללו מכנות בדוק יציאה שיטת ה- מנהל אבטחה מעמד. אז, ל לא לאפשר את יְצִיאָה ו לַעֲצוֹר פעולות, יישום יכול ליצור מדיניות אבטחה באמצעות מנהל אבטחה בכיתה וזורקים את ExceptionException מ ה בדוק יציאה שיטה.

6. מסקנה

במדריך זה בדקנו את System.exit () ו Runtime.getRuntime (). עצור () שיטות בעזרת דוגמה. יתר על כן, דיברנו גם על השימוש והשיטות המומלצות בשיטות אלה.

כרגיל, קוד המקור השלם של מאמר זה זמין באתר Github.


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