2017-04-04 18 views
-2

我正在运行使用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提供输入到进程,并将输出和错误流作为字节数组读取。

+0

我们需要更多的上下文,我建议将[mcve]放在一起,以便人们可以复制问题并帮助您解决问题。 –

+0

StartTime应该设置在waitFor之前的行。使用您当前的代码,您可能会考虑复制过程花费的时间。 –

+0

您没有包含“copy”方法的主体,但它看起来像“copy(process.getInputStream(),resultStream);”线将运行直到完成(输出结束时形成该过程),无论需要多长时间。然后,一旦你到达process.waitFor,那应该立即返回。但是,你仍然在等待copy()命令花费的时间(不过这需要被调用的进程产生输出)。 – user1676075

回答

2

由于user1676075说,你copy方法运行,直到您的过程结束它的输出,让你永远进程的结束前达到process.waitFor从而达到从未在waitFor返回一个不完整的过程代码的情况。

+0

谢谢,尽管我提出的问题本来可以用得更好,但这个答案帮助我理解了发生了什么,并且所有事情都按预期工作。 – gaurav5430

+0

是的,我很抱歉,我从未解决过您的实际问题。您应该将outputStreams以自动刷新模式放入某种数据存储器(ByteBuffer或取决于预期大小的文件),并等待该过程结束,而不使用阻止复制方法。 –

+1

我最终在单独的线程中读取了输出/错误。 waitFor然后按预期工作。 – gaurav5430