我正在做一个程序,我必须等待一个过程才能继续执行。我做了下一个:
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 ,反之亦然。我的问题是:没有像这样的问题,哪种方法最好?
答案 0 :(得分:1)
我看到了两种改进程序的直接方法:
不要使用过时的等待/通知机制。而是依赖java.util.concurrent
中的并发助手。根据更广泛的情况,CountDownLatch
,Semaphore
或Phaser
可能是最佳选择;
让子进程运行而不消耗其输出流是危险的,它可能很容易导致waitFor()
上的死锁。将ProcessBuilder
与inheritIO
一起使用可以避免这种情况。
答案 1 :(得分:0)
我发现了我的问题:问题是外部程序的输出缓冲区已满,这是原因,因为进程被锁定。在waitfor之前我必须阅读程序的所有输出,我的问题才解决了。