繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM