今天在开发时,看到如下这段代码:
private void startServer() throwsException {//register shutdownhook
try{
doStart();
Runtime.getRuntime().addShutdownHook(newThread() {public voidrun() {try{
stopServer();
}catch(Exception e) {
logger.error("shutdown error", e);
}
}
});
isShutDown= false;
logger.info("Server start now !!!");this.await();
}catch(Throwable e) {
e.printStackTrace();this.stopServer();throwe;
}
}
第一次见到Runtime.getRuntime().addShutdownHook,查了一下资料,原来该方法用来在jvm中增加一个关闭的钩子。当程序正常退出,系统调用 System.exit方法或虚拟机被关闭时才会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并不有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以可通过这些钩子在jvm关闭的时候进行内存清理、资源回收等工作。
实例测试一:
public classTestRu