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