Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么重新启动的Java程序失去键盘焦点?_Java_Batch File_Processbuilder_Shutdown Hook - Fatal编程技术网

为什么重新启动的Java程序失去键盘焦点?

为什么重新启动的Java程序失去键盘焦点?,java,batch-file,processbuilder,shutdown-hook,Java,Batch File,Processbuilder,Shutdown Hook,我试图创建一个简化的故障保护Java应用程序,每当它被强制关闭时(在Windows中,使用CTRL+C的CMD命令),它就会自动重启 批处理代码如下所示: @echo关闭 setlocal 启动/等待java BatchWakeMeUpSomehow 如果错误级别为1,请转到重试 echo成功完成 出口 :重试 回音重试。。。 启动/等待java BatchWakeMeUpSomehow java代码如下: public class WakeMeUpSomehow { static c

我试图创建一个简化的故障保护Java应用程序,每当它被强制关闭时(在Windows中,使用CTRL+C的CMD命令),它就会自动重启

批处理代码如下所示:

@echo关闭
setlocal
启动/等待java BatchWakeMeUpSomehow
如果错误级别为1,请转到重试
echo成功完成
出口
:重试
回音重试。。。
启动/等待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及以上的情况下进行无休止的循环,请在
开始
行之前添加一个标签:

: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
    

非常感谢!我将研究这一个,因为目前还不太清楚