我在spring boot定時任務里去呼叫一個Python程式:
Process P1= Runtime.exec(...)
然后我在服務器上kill掉這個python程式后,java程式一直沒有反應,看上去似乎沒有退出,會是什么原因呢?
uj5u.com熱心網友回復:
最好貼一下主邏輯代碼,這樣看不出具體問題。最有可能是JAVA代碼未關閉行程。
uj5u.com熱心網友回復:
public static int runPython(String[] param, String workName, Logger logger) {
int exitCode = 1;
try {
Process proc = Runtime.getRuntime().exec(param);
BufferedReader isReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String isLine;
String errorLine;
while ((errorLine = errorReader.readLine()) != null) {
logger.error(workName + " error:" + errorLine);
}
while ((isLine = isReader.readLine()) != null) {
logger.info(workName + " info:" + isLine);
}
isReader.close();
errorReader.close();
exitCode = proc.waitFor();
} catch (IOException e) {
logger.error(workName + " error", e);
} catch (InterruptedException e) {
logger.error(workName + " error", e);
} finally {
logger.info(workName + " finish exitCode==" + exitCode);
}
return exitCode;
}
uj5u.com熱心網友回復:
你這個代碼本身就存在問題啊。proc的mputStream和ErrorStream的處理,應該與waitFor() 不在同一個執行緒里面呼叫才行。
waitFor是等待子行程處理完畢,兩個Stream是讀取子行程產生的資料。
一般撰寫代碼是,一個Stream分配一個執行緒來處理產生的資料,主執行緒呼叫waitFor卡死,直到子行程退出并且兩個Stream的資料處理完畢,主執行緒才會繼續。
uj5u.com熱心網友回復:
如果子行程已經被主動殺掉了,java行程也會因為這種寫法一直阻塞在這里嗎?uj5u.com熱心網友回復:
打個斷點試一下不就知道了么?debug一下轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/44413.html
標籤:Web 開發
上一篇:尋一位精通Java程式設計的大佬
