我是一個剛開始學習基于Java的多線程編程的學生。作為我的第一個練習之一,我被告知創建一個執行 Windows 計算器的進程,然后等待該進程完成,然后發送消息。這是我所做的代碼的摘錄。Process p = Runtime.getRuntime().exec("calc.exe");p.waitFor();System.out.println("Process finished");當我執行它時,Windows 10 計算器打開,然后我收到“處理完成”消息。我不知道為什么在進程仍在運行時收到消息,因為計算器是打開的,所以我嘗試運行完全相同的代碼,但使用“notepad.exe”作為要執行的命令。這次執行的結果是預期的:直到我關閉記事本才收到消息。我嘗試打開其他Windows 10默認程序,作為“explorer.exe”,有些程序按照它應該的方式工作,而其他程序則沒有。我對它的工作方式的想法是“explorer.exe”或“calc.exe”像某種啟動器一樣工作,所以當他們收到一個執行它們的進程時,他們創建自己的進程,我無法用Java控制程序。這完全是我的猜測。在實際的問題是:為什么會發生呢?Windows 10 計算器和其他程序在進程方面如何工作?提前致謝。
1 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
Process#waitFor()返回int值,它實際上errorlevel是進程的退出代碼(即)。
如果啟動的進程返回非零errorlevel并且“正確”(即按預期)工作,否則您的代碼會失敗。您可以通過運行下面的批處理文件來檢查它:
@echo off
calc.exe
REM explorer.exe
echo Error level: %errorlevel%
它會回報你的環境非零errorlevel輸出的calc.exe和Explorer.exe的,并0為NOTEPAD.EXE。
在我的環境(Windows 7)上,calc.exe也會返回0并且您的代碼片段按預期工作。
還請考慮到某些程序在成功的情況下可能會返回非零退出代碼 - 這不是嚴格的。
基于這一點以及第一個練習不應該太復雜的事實 - 假設您的代碼片段就是答案。
如果無論如何您仍然需要找到解決方案,您可以這樣做(這里是批處理命令,而不是Java):
運行calc.exe:
calc.exe
查找PID的的的calc.exe進程:
tasklist /v /fo csv | findstr /i "calc.exe"
通過運行該過程的無限檢查PID與
break;
當處理不再被呈現,使用命令(假設例如PID = 1111
):tasklist /fi "pid eq 1111"
添加回答
舉報
0/150
提交
取消