可以使用线程这方面的一点解释

时间:2012-04-05 14:45:03

标签: java multithreading process

所以我有一个实现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)循环不会做任何事情。我会删除它。我在上面添加了我之前未提供的其余代码,以便在有人进一步添加任何内容的情况下提供更多上下文。

3 个答案:

答案 0 :(得分:1)

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

也许你看到了连续的输出,因为br还有输入?

答案 1 :(得分:1)

p.waitFor()是等待进程终止的线程,它不会等待“直到线程完成”。如果线程被中断(意味着程序的另一部分引用了线程选择在其上调用interrupt(),通常是因为程序正在关闭),在它等待终止的进程之前{{1}杀死了这个过程。

是围绕waitFor的while循环

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

答案 2 :(得分:1)

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

p.waitFor()确实等到p完成。循环是一种空洞,因为它只执行一次,所以你也可以删除它。

Sooo ...假设p填充br直到完成并退出,waitFor只需等待很短的时间,可能根本不会。

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