gpt4 book ai didi

java - Java 应用程序如何在关闭时自行重启?

转载 作者:行者123 更新时间:2023-12-02 04:38:10 25 4
gpt4 key购买 nike

我想在 Java 应用程序停止时重新启动它。这个 stackoverflow question解决如何启动 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+C 时,程序不会产生输出,这意味着任何带有 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+C 将使程序不可见,并在后台运行。然后我可以通过 Activity 监视器终止剩余的进程。如果此类接收来自用户的输入,那么这将没有什么用处。我想知道是否有办法将新进程与控制台或类似的东西关联起来。

最佳答案

您可以添加一个关闭 Hook ,该 Hook 将在有序的应用程序关闭期间运行。你会这样做:

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 信号。请注意,即使您实现了 native 或 java 信号处理程序,也有一些信号无法处理(例如 Linux/Unix 上的 SIGKILL)

关于java - Java 应用程序如何在关闭时自行重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30506062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com