Za aplikaciju je jako važno da pravilno radi sa resuresima, što uglavnom znači da treba da ih zatvori/ugasi/oslobodi kada više nisu potrebni. To se posebno odnosi na sam kraj rada sa aplikacijom kada baš sve otvorene resurse, uključujući i one iz kojekakvih poolova treba pozatvarati. Čini se da Java developeri pomalo zaboravljaju ovaj slučaj usled nedostatka destruktora, potpuno se oslanjajući na garbage collector, koji, jasno, nije svemoguć i za koji se zna čemu služi.
Sve je u redu kada su korisnici disciplinovani i kada na pravilan način ugase aplikaciju. Realni slučaj, naravno, nije takav, i korisnici često znaju da, namerno ili slučajno, "ubiju" konzolu. Svako neregularno zatvaranje aplikacije može da ostavi pregršt otvorenih resursa što može da se na najrazličitije načine odrazi na stanje sistema (na pr.: da se "istroše" sve konekcije ka bazi itd.).
Počevši od Jave 1.3, postoji način da se "uhvati" (hook-uje) signal za gašenje JVM. Reč je o tkzv. JVM Shutdown Hook. Hook je kod koji se izvršava uvek pre nego što Javina VM krene u proces gašenja, bez obzira da li se aplikacija zatvara regularnim putem ili nregularno, tj. nasilno. Jasno je da JVM Shutdown Hook obično sadrži ili poziva logiku za zatvaranje svih otvorenih resursa.
Sa implementacione strane, stvari su strašno jednostavne.
JVM Shutdown Hook je običan Thread koje je inicijalizovan, ali još
nije startovan:
class ShutdownHook extends Thread {
...
public void run() {
...
}
}
Instancu takvog Threada treba registrovati kao
JVM Shutdown Hook sledećim pozivom:
ShutdownHook hook = new ShutdownHook(...);
Runtime.getRuntime().addShutdownHook(hook);I to je sve. Kada JVM dobije signal za gašenje, startovaće prvo hook thread. Obično hook thread prilikom inicijalizacije dobije instancu na neki glavni menadžer aplikacije koji "zna" kako da oslobodi resurse.
Mali primer za download.