我想在停止时重新启动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 + Ç会使程序不可见的,在后台运行。然后我可以通过活动监视器杀死剩余的进程。如果这个班级收到用户的输入,这将是没有用的。我想知道是否有新的过程与控制台或类似的东西相关联。
你检查:http://stackoverflow.com/questions/1216172/如何可以我拦截ctrlc在一个cli的应用程序? – JonasCz
会话方式:CTRL + C不是规则的例外情况吗?如果你确实真的想要一个程序关闭,那么这就是你所使用的,所以如果它再次自动地恢复生机,它会相反的。 – Gimby
_“你检查了这个:[......]”我没有。我没有搜索Ctrl + C,因为我想要一个更通用的解决方案,这可以用于Ctrl + C和其他最终可能的方式来终止JVM。 @Gimby,我用一个类似的想法问了这个问题:我想知道是否有可能运行一个难以杀死的.jar,因为到目前为止我运行的每一个表面上都表现得非常好。 – goncalotomas