所以我有一个实现Runnable的Java类。在运行方法中,我得到了以下代码,我不完全理解为什么它看起来是这样工作的,我希望有人能向我解释。
代码为:
public void run() {
Process p = null;
ProcessBuilder builder = new ProcessBuilder();
builder.redirectErrorStream(true);
p = builder.command("/opt/program/testscript.sh").start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
try {
while ((line = br.readLine()) != null) {
log.info(line);
}
boolean running = true;
while(running) {
p.waitFor();
running = false;
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
p.destroy();
}
}
因此,最上面的部分是从正在运行的进程中获取输出并显示它。不过,中间部分似乎是代码等待线程处理的地方。据我所知,代码应该在p.waitFor()
命令的while循环中停止并等待,直到线程完成,然后整个过程应该结束。然而,当线程运行时,输出会继续显示,所以很明显,顶部的while循环仍然被命中。
线程一直是我的弱点,很明显,我只是没有完全理解这里发生了什么。代码是有效的,所以我想它是有效的。尽管它可能没有按照应有的方式编码?不管怎样,我们非常感谢您的帮助,谢谢。
更新
谢谢你提供的所有信息。while(running)循环什么都不做是有道理的。我会删除它。我在上面添加了之前没有提供的其余代码,以提供更多的上下文,以防有人需要添加任何内容。
当填充br
的人关闭它时,第一个循环停止。
CCD_ 3确实等待直到CCD_ 4结束。这个循环有点无效,因为它只执行一次,所以你最好把它删除
Sooo。。。假设p
是填充br的东西,直到它完成并退出,waitFor
将只需要等待很短的时间,可能根本不需要。
为了更准确地了解正在发生的事情,需要p
背后的代码,br
中填充的内容以及这些事情是如何开始的。
顶部循环将运行,直到br
的所有输入都用完,然后线程应等待进程p
完成运行。
也许你看到了连续输出,因为br
中还有输入?
p.waitFor()
是等待进程终止的线程,它不是在等待"直到线程完成"。如果线程在等待的进程终止之前被中断(这意味着程序的另一部分引用了选择在其上调用interrupt()
的线程,通常是因为程序正在关闭),那么p.destroy()
将终止该进程。围绕waitFor的while循环是无用的。
您正在查看实现Runnable的代码,但没有说明使用该Runnable创建线程的位置。去寻找那个部分,我希望有不同的线程正在使用Runnable创建。