可以对线程的这一方面进行一点解释



所以我有一个实现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创建。

最新更新