在Java窗口程序中按ctrl+c会强行中止Java程序。点击窗口关闭按钮也会强行中止程序。
Runtime.getRuntime().addShutdownHook(hooker)允许注册一个线程,在System.exit()之后、finalize被调用之前执行它。
根据文档,如果有多个程序注册了hooker, 它们会被同时启用,顺序不被保证。比如你想在关闭前透过Jms发送消息,很可能JMS服务已经关闭。
Google告诉我们,还有别的好办法,就是利用Sun的独家秘技,直接拦截系统信号。注意,在非Sun的jvm上无效。
网址:http://www.smotricz.com/kabutz/Issue043.html
简单应用如下:
SignalHandler handler = new SignalHandler(){
public void handle(Signal sig) {
Server.this.exit(0);
}
};
Signal.handle(new Signal("INT"),handler); //hook ctrl+c
Signal.handle(new Signal("TERM"),handler); //hook alt+f4
OK, 这下关闭程序可以有限处理了~