Java 可以对线程的这一方面稍作解释

Java 可以对线程的这一方面稍作解释,java,multithreading,process,Java,Multithreading,Process,所以我有一个Java类,它实现了Runnable。在run方法中,我得到了下面的代码,我不完全理解为什么它会像看上去那样工作,希望有人能给我解释一下 代码是: public void run() { Process p = null; ProcessBuilder builder = new ProcessBuilder(); builder.redirectErrorStream(true); p = builder.command("/opt/program

所以我有一个Java类,它实现了Runnable。在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();
    }
}
因此,最上面的部分是从正在运行并显示它的进程中获取输出。但中间部分似乎是代码等待线程处理的地方。据我所知,代码应该停止并在while循环中使用
p.waitFor()
命令等待线程完成,然后整个过程应该结束。但是,当线程运行时,输出将继续显示,因此很明显,顶部的while循环仍在运行

线程一直是我最薄弱的一点,很明显,我只是没有完全理解这里发生了什么。虽然代码是有效的,所以我想它是有效的。虽然它可能没有按应有的方式编码?无论如何,非常感谢您的帮助,谢谢

更新


谢谢你提供的所有信息。while(running)循环没有做任何事情是有道理的。我会移除它。我在上面添加了以前没有提供的代码的其余部分,以提供更多的上下文,以防任何人有任何进一步的添加。

顶部循环将运行,直到
br
的所有输入都已用尽,然后线程应等待进程
p
完成运行


可能您会看到连续输出,因为
br
中仍有输入?

顶部循环将运行,直到
br
中的所有输入都已用尽,然后线程应等待进程
p
完成运行

可能您看到了连续输出,因为在
br

p中仍然有输入。waitFor()是等待进程终止的线程,而不是等待“直到线程完成”。如果线程在其等待的进程终止之前被中断(指程序的另一部分,该部分引用了选择在其上调用
interrupt()
,通常是因为程序正在关闭),则
p.destroy()
会终止进程。waitFor周围的while循环是无用的

您正在查看实现Runnable的代码,但没有说明使用该Runnable创建线程的位置。查找该部分,我希望有不同的线程使用该可运行线程创建。

code>p.waitFor()
是等待进程终止的线程,而不是等待“直到线程完成”。如果线程在其等待的进程终止之前被中断(指程序的另一部分,该部分引用了选择在其上调用
interrupt()
,通常是因为程序正在关闭),则
p.destroy()
会终止进程。waitFor周围的while循环是无用的


您正在查看实现Runnable的代码,但没有说明使用该Runnable创建线程的位置。查找该部分,我希望使用该Runnable创建不同的线程。

第一个循环在填充
br
的人关闭它时停止

p.waitFor()
确实要等到
p
完成。循环有点空,因为它只执行一次,所以您最好删除它

所以。。。假设
p
正在填充br,直到完成并退出,
waitFor
只需等待很短的时间,可能根本不需要等待


为了更准确地理解正在发生的事情,我们需要
p
后面的代码,任何填充
br
的东西,以及这些东西是如何开始的。

第一个循环在填充
br
的人关闭它时停止

p.waitFor()
确实要等到
p
完成。循环有点空,因为它只执行一次,所以您最好删除它

所以。。。假设
p
正在填充br,直到完成并退出,
waitFor
只需等待很短的时间,可能根本不需要等待


为了更准确地理解正在发生的事情,我们需要
p
背后的代码,任何填充
br
的东西,以及这些东西是如何开始的。

有没有任何答案给了你你想要的解决方案/解释,或者你还有什么其他的要求?是的,事实上,我想他们确实回答了这个问题。说得好,我将其中一个标记为已接受的答案。有没有任何答案给了你想要的解决方案/解释,或者你还有什么其他的要求?是的,事实上,我想他们确实回答了这个问题。说得好,我将其中一个标记为已接受的答案。