比如说我让我的应用程序在Linux终端上运行,我按下键盘上的“CTRL + C”来终止它将终止Java程序的过程。
有没有办法在我的Java应用程序中捕获此“请求”,以便我可以正常关闭它并释放所有资源/写入日志。如果它对响应产生影响,我会运行几个不同的线程。
我知道你有一个addShutDownHook,但是在Java文档中写的,在某些情况下不会调用它,比如linux中“CTRL + C”的kill信号......还有其他方法吗? / p>
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run ()
{
// TODO: implement graceful shutdown here.
}
});
答案 0 :(得分:3)
我认为免责声明仅适用于kill -9
,因此您不必依赖调用的关闭挂钩来维护数据的一致性。
因此,如果允许进程通过操作系统对该信号进行操作,则会调用关闭挂钩,如果您知道操作系统的工作方式,那么这一点非常明显,但对于所有Java开发人员而言可能并非如此。
实际上在javadoc中详细解释了这一点。
另外值得注意的是,在VM中可以注册多个关闭挂钩,因此您的关闭挂钩可能不是几个中的一个。
答案 1 :(得分:2)
这适用于我,在Linux上捕获SIGINT / Ctrl-C:
public class TestShutdownHook
{
public static void main(final String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}