如果进程在外部被杀死,则处理

时间:2016-12-23 14:18:57

标签: java multithreading kill-process shutdown-hook sigkill

我正在编写一个程序,我在一个进程中创建多个线程。

我需要处理这个问题,如果某人使用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" );
            }
        } );

在我的主要方法中,但它似乎不起作用。

2 个答案:

答案 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?");
        }
    }
}