我正在运行使用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