所以我有一个实现Runnable的Java类。在run方法中,我得到了以下代码,我不完全理解为什么它的工作方式似乎如此,希望有人可以向我解释。
代码是:
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)循环不会做任何事情。我会删除它。我在上面添加了我之前未提供的其余代码,以便在有人进一步添加任何内容的情况下提供更多上下文。
答案 0 :(得分:1)
顶部循环将一直运行,直到br
的所有输入都已用尽,然后线程应该等待进程p
完成运行。
也许你看到了连续的输出,因为br
还有输入?
答案 1 :(得分:1)
p.waitFor()
是等待进程终止的线程,它不会等待“直到线程完成”。如果线程被中断(意味着程序的另一部分引用了线程选择在其上调用interrupt()
,通常是因为程序正在关闭),在它等待终止的进程之前{{1}杀死了这个过程。
您正在查看实现Runnable的代码,但您没有说明使用该Runnable创建线程的位置。去寻找那个部分,我希望使用Runnable创建不同的线程。
答案 2 :(得分:1)
当填充br
的人关闭它时,第一个循环停止。
p.waitFor()
确实等到p
完成。循环是一种空洞,因为它只执行一次,所以你也可以删除它。
Sooo ...假设p
填充br直到完成并退出,waitFor
只需等待很短的时间,可能根本不会。
为了更准确地了解正在发生的事情,我们需要p
背后的代码,任何填充br
以及这些事情如何开始。