[英]Why does my restarted Java program lose keyboard focus?
我试图创建一个简化的故障安全Java应用程序,只要它被强制关闭(在Windows中,使用CTRL + C的CMD命令),该应用程序就会自行重启。
批处理代码如下所示:
@echo off
setlocal
start /wait java BatchWakeMeUpSomehow
if errorlevel 1 goto retry
echo Finished successfully
exit
:retry
echo retrying...
start /wait java BatchWakeMeUpSomehow
Java代码是这样的:
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();
}
}
}
我想澄清一下我的理解。 我认为,因为Java在JVM环境中运行,所以在重新启动被强制关闭的JVM方面存在一些限制(如果我们通过批处理文件重新启动被强制关闭的JVM,那么它将失去光标焦点,只能在没有键盘焦点的新CMD窗口中运行。
我的目标是使该应用程序保持循环运行(例如“数字怪胎”),但我只能将其重新运行一次(在无响应的CMD窗口中运行)
有人建议我看一下Apache Daemon工具,但是我不确定这有什么帮助。
要在错误级别1和更高级别的情况下进行无限循环,请在start
行之前添加标签:
:run
start /wait java BatchWakeMeUpSomehow
if errorlevel 1 echo retrying... & goto run
echo Finished successfully
但是,这也会打开一个新窗口,因此,如果要在已经启动的窗口中重新启动java
进程,则可以使用typeperf
来检查其CPU使用率(以便您可以强制关闭该进程并重新启动它)或简单地重新启动java
一旦执行返回到批处理文件中。
万一java
进程退出(不挂起),我们可以使用tasklist
来检测到它:
:run start java BatchWakeMeUpSomehow :check timeout 1 >nul tasklist /fi "imagename eq java.exe" | find "java.exe" >nul if errorlevel 1 echo retrying... & goto run goto check
如果java
进程挂起,并且CPU使用率为0%1分钟:
if not "%~1"=="childprocess" goto main :loop java BatchWakeMeUpSomehow goto loop :main start "" "%~dpnx0" childprocess :check for /f "skip=2 delims=, tokens=2" %%a in (' typeperf "\\process(java)\\%% processor time" -sc 1 -si 60 ') do if %%a=="0.000000" taskkill /f /im java.exe goto check
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.