【发布时间】:2017-02-26 13:46:13
【问题描述】:
通常我使用这段代码来运行一个 bash 脚本并得到它的输出
ProcessBuilder pb = new ProcessBuilder("/home/myscript");
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputRead;
p.waitFor();
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
这工作正常,但这次我使用的 bash 脚本没有终止。它始终处于活动状态,当它检测到某些东西时,它会打印出来。我想启动脚本,等待一段时间,然后检查它是否检测到某些东西。我尝试使用p.wait(periode);
我试过这段代码
p.wait(10000);
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
我不确定这是否是解决我的问题的正确方法,但无论如何我收到此代码的错误
java.lang.IllegalMonitorStateException
我的问题实际上不是关于等待,而是如何在等待后停止进程并且仍然能够获得输出。
【问题讨论】:
-
通常,IllegalMonitorStateException 意味着线程试图等待/通知对象监视器而不拥有它。确保没有线程试图这样做。
-
我明白你在做什么。 p.wait() 需要在同步语句中:docs.oracle.com/javase/tutorial/essential/concurrency/…。如果您希望线程等待,请使用 Thread.sleep()。
-
脚本“/home/myscript”写入文件?
-
是什么让您认为在
Process对象上调用Object.wait()是个好主意?不是-该方法具有完全不同的目的,并且具有您需要将监视器保持在对象上的前提条件(对其进行同步)。但这不能解决您的问题。
标签: java processbuilder