簡體   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