有没有办法动态重启循环打印输出的HelloWorld Java程序?
考虑以下永远打印“Hi world”的简单代码: 以下是输出: 有没有办法设计一个外部的第三个程序,当我们杀死这个程序时,它会注意到这个程序(就像在命令行中使用CTRL+C);然后这个“家长”程序继续运行“Hello World” 我想可能是这样的: 所以我的问题是-我如何模拟这样的代码,它具有这种故障安全功能?有没有办法做到这一点 谢谢有没有办法动态重启循环打印输出的HelloWorld Java程序?,java,restart,Java,Restart,考虑以下永远打印“Hi world”的简单代码: 以下是输出: 有没有办法设计一个外部的第三个程序,当我们杀死这个程序时,它会注意到这个程序(就像在命令行中使用CTRL+C);然后这个“家长”程序继续运行“Hello World” 我想可能是这样的: 所以我的问题是-我如何模拟这样的代码,它具有这种故障安全功能?有没有办法做到这一点 谢谢 编辑:我在这里找到了一个简洁的链接,它是相关的,但解决了一些不同的问题-如果它像这样简单,你可以简单地使用关闭钩子 Runtime.getRuntime(
编辑:我在这里找到了一个简洁的链接,它是相关的,但解决了一些不同的问题-如果它像这样简单,你可以简单地使用关闭钩子
Runtime.getRuntime().addShutdownHook(() -> {
//do whatever you want to be done when closing the program here
});
尽管您可能会遇到一些问题,但如果您想重新启动程序并使用相同的命令行。您可以使用关机挂钩再次启动应用程序。请注意这一点的缺点——JVM永远不会停止运行,除非您强制杀死它
首先,这是一项具有挑战性的任务。试试看,让我知道它是否有效
public class WakeMeUpSomehow {
static class Message extends Thread {
public void run() {
try {
while(true)
{
System.out.println("Hello World from run");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
Runtime.getRuntime().addShutdownHook(new Message());
while(true)
{
System.out.println("Hello World");
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Shutdown钩子保证在程序的正常关闭事件上运行,但不能在各种异常终止上运行,例如JVM被强制终止时 一种解决方案可能是使用批处理脚本:
@echo off
setlocal
start /wait java WakeMeUpSomehow
if errorlevel 1 goto retry
echo Finished successfully
exit
:retry
echo retrying...
start /wait java WakeMeUpSomehow
不必详细说明您希望这样做的原因:-),一种“健壮”的方法是在以下位置执行“父”程序或批处理脚本:
以上方法甚至可以承受计算机重启 在Windows中,执行此操作的方法是将程序作为服务运行。它允许在系统启动时启动程序(没有用户登录),并在程序关闭时重新启动程序。Windows资源工具包提供了一个名为SrvAny.exe的程序,允许您将任何程序作为服务运行 你应该结账。它提供了许多实用程序,而不仅仅是重新启动一个程序 例如
听起来您希望将应用程序作为服务运行(windows)或守护进程运行(Unix) 在Java中,您通常会为此使用服务包装器。我用这个 Commons Daemon在Windows上提供了将Java应用程序作为服务运行的功能。您甚至可以将可执行文件重命名为程序的可执行文件。在Unix上,您可以重新启动Java应用程序。我在我的主类中编写了一个精简的通用启动API,由两个可执行文件调用
如果您需要在生产环境中这样做(而不是作为某种练习),我相信这是唯一可靠的方法。@AbdulAhmad-我想是的,在Linux中,您通常如何使用init进程(例如upstart或systemd)来管理长时间运行的服务。也许Windows也有类似的功能?@ChrisMartin-那么对于Linux来说,这个任务很简单?我可以尝试将Linux与虚拟机结合使用“简单”是一种延伸,仅此就有些过分了,但也许是一个很好的学习练习?:)所以我猜
addShutdownHook()
代码可以放在原始类中,然后我们可以做任何我们喜欢的事情。只需在进入while循环之前添加它,它就可以完成它的jobOne注释了——我确实做到了,但是。。。。大括号内有一个线程,对吗?参数是一个可运行的
addShutDownHook
创建一个处于初始化状态的线程,该线程将在应用程序退出时启动。大括号内是当关闭钩启动时将运行的代码。你们中的任何人都可以在这里发布完整的代码吗?我试过了,但作业没有起作用:(你介意分享那个链接上的内容吗?我不太愿意打开外部链接当我尝试用CTRL+C
终止程序时,它实际上进入了一个无限循环(打印“hello world from run”)我不能CTRL+C
这就是你想要的,什么是3PP调度程序。例如,check,java应用程序最著名的调度程序之一,嗯?我不知道你的意思。这可以称为“看门狗脚本”。我觉得这很有趣。上面写着,但是在应用程序不是交互式的情况下(服务器应用程序),目前没有便携的方式通知虚拟机即将关闭。
-尽管我如何使用它仍然有点模糊。那么您已经创建了一些代码来重新启动您自己的程序?@Coffee Commons守护程序通过提供一个小型本机可执行文件来工作,该文件可以在自己的进程空间中运行JVM或宿主JVM.dll。然后,它通过各种API方法调用应用程序,包括捕获系统信号时(例如CTRL+C)。结果是,应用程序可以作为服务运行(甚至可以交互运行)。许多生产Java服务器应用程序都使用这种方法。JSvc与supervise
工具相比如何?我查了一个叫做daemontools的东西,发现了一个叫做“监督”的东西?我们很好奇你是否知道
@echo off
setlocal
start /wait java WakeMeUpSomehow
if errorlevel 1 goto retry
echo Finished successfully
exit
:retry
echo retrying...
start /wait java WakeMeUpSomehow