2015-05-28 68 views
0

我想在停止时重新启动Java应用程序。 这个stackoverflow question地址如何启动一个Java应用程序。Java应用程序在关闭时如何重新启动?

是否有可能使程序在关闭时自行重启?或者在退出之前保存它的状态?

我的第一种方法是试图运行一个线程传递以下Runnable实现:

public void run() { 
    try { 
     while(true) { 
      // perform important computations 
     } 
    } 
    catch(Throwable t) { 
     // save state before exiting and start again 
     System.out.println("saving..."); 
    }  
} 

这并没有工作,因为当我按下按Ctrl + ç程序不产生输出,这意味着具有ProcessBuilder的任何代码都不会运行。

如果不可能,如何使用其他编程语言或使用操作系统设置(例如UNIX)让应用程序保持运行状态(停止关闭和/或在关闭后再次启动)?


更新:我用pens-fan-69的代码与ProcessBuilder实例一起。作为参考,这里的代码看起来:

public class Unkillable { 

    public static void main(String[] args) { 
     System.out.println("I'm running!"); 
     Runtime runtime = Runtime.getRuntime(); 
     runtime.addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       // save state before exiting and start again 
       System.out.println("Shuting down..."); 
       ProcessBuilder pb = new ProcessBuilder("java", "Unkillable"); 
       try { 
        pb.start(); 
       } catch (IOException e) { 
        System.out.println("Error executing callback function."); 
       } 
      } 
     }); 

     while(true) { 
      // fancy code goes here 
     } 
    } 
} 

这配备了一个副作用:当你在控制台上运行此,击中按Ctrl + Ç会使程序不可见的,在后台运行。然后我可以通过活动监视器杀死剩余的进程。如果这个班级收到用户的输入,这将是没有用的。我想知道是否有新的过程与控制台或类似的东西相关联。

+1

你检查:http://stackoverflow.com/questions/1216172/如何可以我拦截ctrlc在一个cli的应用程序? – JonasCz

+0

会话方式:CTRL + C不是规则的例外情况吗?如果你确实真的想要一个程序关闭,那么这就是你所使用的,所以如果它再次自动地恢复生机,它会相反的。 – Gimby

+0

_“你检查了这个:[......]”我没有。我没有搜索Ctrl + C,因为我想要一个更通用的解决方案,这可以用于Ctrl + C和其他最终可能的方式来终止JVM。 @Gimby,我用一个类似的想法问了这个问题:我想知道是否有可能运行一个难以杀死的.jar,因为到目前为止我运行的每一个表面上都表现得非常好。 – goncalotomas

回答

1

您可以添加将在有序应用程序关闭期间运行的关闭挂接。你会做它像这样:

Runtime runtime = Runtime.getRuntime(); 
runtime.addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     // save state before exiting and start again 
     System.out.println("saving..."); 
    } 
}); 

但是,你要注意,这不会涵盖外部信号杀死进程或JVM否则不以有序的方式关机的情况下。

http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/signals.html有关JVM上下文中信号主题的讨论,您可以专门查看http://en.wikipedia.org/wiki/Unix_signal来讨论POSIX信号。请注意,即使你实现本地或Java信号处理程序,有一些无法处理(例如SIGKILL在Linux/Unix的)一些信号

+0

你是什么意思由外部信号?它是否适用于Ctrl + C?你能详细说明一下吗? – goncalotomas

+2

@Aprendiz,是的,它适用于Ctrl + C,并且例如外部信号可以是linux中的“killall -9 java”,或者是“是”,点击“此应用程序已停止响应,是否要强制关闭它?“或JVM崩溃。 – JonasCz

+0

@Aprendiz http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/signals.html讨论了JVM上下文中的信号主题,您可以查看http:/ /en.wikipedia.org/wiki/Unix_signal专门讨论POSIX信号。请注意,即使您实现了native或java信号处理程序,也有一些信号*无法处理(例如,Linux/Unix上的SIGKILL)。 –

相关问题