如何知道流程什么时候结束?

时间:2014-12-10 08:44:31

标签: java process wait notify

我正在做一个程序,我必须等待一个过程才能继续执行。我做了下一个:

synchronized (obj) {
   try{
   Process p = Runtime.getRuntime().exec(command);
   p.waitFor();
   obj.notifyAll();
   System.out.println("The program command has finished");
   ...
   }
   catch(InterruptedException e){
       e.printStackTrace();
   }
}

其中:

命令是一个字符串,其中包含要执行的进程命令

obj 是类对象的对象

我意识到有时句子“程序命令已经完成”没有被写入。有时解决方法是将对 notifyAll 的调用更改为 notify ,反之亦然。我的问题是:没有像这样的问题,哪种方法最好?

2 个答案:

答案 0 :(得分:1)

我看到了两种改进程序的直接方法:

  1. 不要使用过时的等待/通知机制。而是依赖java.util.concurrent中的并发助手。根据更广泛的情况,CountDownLatchSemaphorePhaser可能是最佳选择;

  2. 让子进程运行而不消耗其输出流是危险的,它可能很容易导致waitFor()上的死锁。将ProcessBuilderinheritIO一起使用可以避免这种情况。

答案 1 :(得分:0)

我发现了我的问题:问题是外部程序的输出缓冲区已满,这是原因,因为进程被锁定。在waitfor之前我必须阅读程序的所有输出,我的问题才解决了。