process.waitFor(timeout, timeUnit) 没有按预期工作
process.waitFor(timeout, timeUnit) does not work as expected
我是 运行 一个使用 ProcessBuilder 的进程。
这是相关代码:
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 秒后收到有关失败的错误消息吗?
注意事项:
我正在使用标准输入向进程提供输入,并将输出和错误流读取为字节数组。
正如 user1676075 所述,您 copy
方法一直运行到您的进程完成其输出,因此您在进程完成之前从未达到 process.waitFor
,因此永远不会达到 waitFor
returns 一个不完整的过程代码。
我是 运行 一个使用 ProcessBuilder 的进程。 这是相关代码:
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 秒后收到有关失败的错误消息吗?
注意事项: 我正在使用标准输入向进程提供输入,并将输出和错误流读取为字节数组。
正如 user1676075 所述,您 copy
方法一直运行到您的进程完成其输出,因此您在进程完成之前从未达到 process.waitFor
,因此永远不会达到 waitFor
returns 一个不完整的过程代码。