我正在運行使用ProcessBuilder的進程。 這是相關代碼:process.waitFor(timeout,timeUnit)不能按預期方式工作
ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
ByteArrayOutputStream errorMessage = new ByteArrayOutputStream();
ProcessBuilder pb = null;
pb = new ProcessBuilder("/usr/local/bin/convert", "-limit", "time", "50", "-", "-resize", maxWidth + "x" + maxHeight+">", "-quality", "82","png:-");
System.out.println(pb.command());
long startTime = System.currentTimeMillis();
System.out.println("start time: " + startTime);
Process process = pb.start();
OutputStream stdIn = process.getOutputStream();
copy(input, stdIn);
stdIn.flush();
stdIn.close();
copy(process.getInputStream(), resultStream);
copy(process.getErrorStream(), errorMessage);
boolean exitStatus = process.waitFor(15, TimeUnit.SECONDS);
if (!exitStatus) {
System.out.println("Image processing failed with status " + exitStatus + ": " + errorMessage.toString());
}
input.close();
System.out.println("returning");
long endTime = System.currentTimeMillis();
System.out.println(endTime);
System.out.println("difference :" + (endTime - startTime)*1.0/1000 + " seconds");
return resultStream.toByteArray();
的差別是90秒,但我不應該得到關於後15秒失敗的錯誤消息?
注意: 我使用stdin提供輸入到進程,並將輸出和錯誤流作爲字節數組讀取。
我們需要更多的上下文,我建議將[mcve]放在一起,以便人們可以複製問題並幫助您解決問題。 –
StartTime應該設置在waitFor之前的行。使用您當前的代碼,您可能會考慮複製過程花費的時間。 –
您沒有包含「copy」方法的主體,但它看起來像「copy(process.getInputStream(),resultStream);」線將運行直到完成(輸出結束時形成該過程),無論需要多長時間。然後,一旦你到達process.waitFor,那應該立即返回。但是,你仍然在等待copy()命令花費的時間(不過這需要被調用的進程產生輸出)。 – user1676075