2009-10-23 36 views

回答

65

您可以将shutdown hook每当虚拟机关闭它获取运行VM:

Java虚拟机在响应关闭以两种事件:

  • 程序当最后一个非守护进程线程退出或退出(等效地,System.exit)方法被调用时退出,或者

  • 该virt响应于用户中断终止计算机,诸如键入Ctrl + C或系统范围的事件,诸如用户注销或系统关闭。

你传递的关闭钩子必须遵循一些规则,但是,一定要仔细阅读所链接的文档,以避免出现任何问题的线索。这包括确保线程安全,线程快速终止等。

另外,正如Jesper指出的那样,关闭挂钩保证在VM正常关闭时运行,但如果VM进程被强制终止,吨。如果原生代码出现故障,或者您强行终止进程(kill -9taskkill /f),则可能会发生这种情况。

但是在这些情况下,所有的赌注都无济于事,所以我不会浪费太多的思考。

+0

当心关闭挂钩,不能保证在任何情况下运行;可能会出现这种情况,因为它们没有运行,所以请勿根据您在关机挂钩中执行的操作来使程序正常运行。 – Jesper 2009-10-23 08:08:20

+0

当进程被强制终止时('TerminateProcess()'或'SIGKILL'),它们不会运行,但超出了正常运行的范围,并且由于Ctrl + C已经被关闭钩子覆盖了,所以使用它是安全的。无论如何,如果操作系统真的终止你的进程,你不能做太多事情。 – Joey 2009-10-23 08:45:38

+0

如果我执行'kill'(发送一个TERM信号),这会在关机挂钩中被捕获吗? (请注意,它不同于'kill -9',我从上面可以理解它不会陷入困境。) – ADTC 2013-11-07 11:20:20

14

只是为了快速控制台测试目的...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

你的例子是RaspberryPI特定的('SoftPwm','gpio')。您可能想要跳过这些方法调用。 – harpun 2015-10-04 13:41:24