我正在编写一个程序,我在一个进程中创建多个线程。
我需要处理这个问题,如果某人使用kill -9信号或Ctrl + C在某人的外部杀死该程序,我的程序应该在关闭之前执行某些操作,例如它应该将进程的状态更改为在数据库中中止。
我该如何处理?
我需要addShutdownHook()
吗?还是有其他更好的解决方案来解决我的问题吗?
我已添加:
Runtime.getRuntime().addShutdownHook( new Thread() {
@Override
public void run() {
logger.info( "Running Shutdown Hook" );
//call some method
System.out.println( "Running Shutdown Hook" );
}
} );
在我的主要方法中,但它似乎不起作用。
答案 0 :(得分:1)
简短的回答:可能不起作用。
请参阅JavaDoc了解addShutdownHook():
在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭。当虚拟机在外部终止时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用...如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。
换句话说:关闭钩子不是满足您要求的可靠选择。
答案 1 :(得分:0)
你把它放在一个可以实例化的地方吗?尝试运行以下内容并将其删除
import java.util.concurrent.TimeUnit;
public class KillTest {
public static void main(String args[]) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
call some method
System.out.println("Running Shutdown Hook");
}
});
try{
TimeUnit.MINUTES.sleep(10);
}catch(Exception e){
System.out.println("Error thrown");
}finally {
System.out.println("How awesome is finally?");
}
}
}