2012-01-04 18 views

Odpowiedz

30

O ile mi wiadomo, wyjaśnię to poniżej. Możesz go znaleźć w Google i znaleźć wiele informacji.

addShutdownHook() zarejestruje niektóre działania, które mają być wykonane na zakończenie Programu. Program, który uruchamiasz, kończy się na dwa sposoby:

  1. główny wątek (root) kończy działanie kontekstu;
  2. program spełnia pewną nieoczekiwaną sytuację, więc nie może przejść dalej.

Jeśli dodasz ShutdownHook, zaczep rozpocznie wątek, który zacznie działać tylko w momencie zakończenia. Na przykład:

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
     System.out.println("Running Shutdown Hook"); 
     } 
    }); 

wypisze Running Shutdown Hook w momencie zakończenia programu w dowolnym momencie. Możesz nawet zadzwonić pod numer System.exit(0).

Na przykład można google, jest ich wystarczająco dużo. A pytanie "Kiedy powinieneś tego używać" przypomina pytanie "Co robi catch w oświadczeniu try-catch".

Można mieć wiele takich sytuacji:

  • program stworzył wiele plików tymczasowych w systemie plików, które chcesz go usunąć;
  • musisz wysłać sygnał o niebezpieczeństwie do innego procesu/maszyny przed zakończeniem;
  • wykonać wszelkie czynności związane z czyszczeniem, rejestrowaniem lub błędami po nieoczekiwanych zachowaniach.

Wszystko to będzie potrzebne w pewnym momencie.

Do przykładów można iść tu Example 1 lub Example 2

+0

Powody podane w celu rozwiązania umowy są niedokładne. Zobacz odpowiedź Buhake'a na poprawną wersję. – meriton

8

się tylko martwić haki zamykania kiedy chcesz coś się wydarzy, gdy dojdzie do zamykania na maszynie wirtualnej.

Od Javadoc:

Maszyna wirtualna Java zamyka w odpowiedzi na dwa rodzaje wydarzeń:

  • Program zakończy się normalnie, gdy ostatnie non-demon wychodzi gwint oraz gdy jest wywoływana metoda exit (równoważnie System.exit) lub
  • Maszyna wirtualna jest przerywana w odpowiedzi na przerwanie przez użytkownika, na przykład wpisanie^C lub zdarzenie o zasięgu systemowym, takie jak wylogowanie użytkownika lub zamknięcie systemu.

ten sposób hak jest zamykania inicjowany i startem wątek zostaje wykonany, kiedy nastąpi zamknięcie JVM.

Popularne przykłady haków zamykających istnieją w serwerach aplikacji (takich jak JBoss AS). Po naciśnięciu klawisza Ctrl + C, JVM wywoła zarejestrowane wszystkie haki zamykające Runtime (takie jak haczyki zamknięcia JBoss) przed wyjściem.

+0

ale jak będzie biegać Temat gdy 'sama JVM' jest shutdowned. – garg10may

+0

Gdy maszyna JVM jest już zamknięta, wszystkie wątki zostały już zakończone. Nie rozumiem twojego pytania. –

+1

@ garg10may - tuż przed zamknięciem JVM zostanie wywołany kod obecny w shutDownHook. Metoda addShutDownHook pobiera wątek jako argument wejściowy. Możesz określić dowolne zadania, którymi chcesz się zająć przed końcowym zakończeniem JVM w tym wątku. –

2

Jeden przypadek to: Jeśli któreś wątki demona, które należy zatrzymać przed zamknięciem jvm (lub) wszelkie inne wątki backendu (w większości wątki demona) muszą zostać zakończone z wdziękiem, zapiszesz hak zamykający i wykonasz go używając powyższego kod. Oto interesująca dyskusja, którą mieliśmy na temat SO kilka dni temu. Shutdown hook

Powiązane problemy