addShutdownHook作为一个正常关闭Java程序的途径,其实是非常有用的。
有可知,当程序正常退出,或者为响应用户中断而终止虚拟机的时候,就会调用里面的线程,来作最后的退出处理。
ShutdownHook只是一个已初始化但为启动的线程。当JVM开始执行关闭序列时,它才开始已某种随机程序注册和并行执行shutdown hooks。这是关闭Java程序的一个重要的途径。在shutdown hooks里,可以执行各种关闭和释放资源的方法,例如:
private void setupShutdownHook(final Initiator initiator) { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { log.info("Shutting down the service... "); initiator.stop(); journalEventHandler.clear(); ticDbApp1EventHandler.clear(); ticDbApp2EventHandler.clear(); cdl.countDown(); log.info("The Application is shutdown!"); } }); }
举个栗子,如果是使用了BufferedWriter但是没有在最后执行flush()和close()的方法,很可能就会导致数据丢失。所以在shutdown hooks里面,执行这类型的关闭方法,非常重要。
在linux/unix下,Ctrl+C或者kill -15都可以;遗憾的是在Eclipse中无法实现。
参考:
本文完