0

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

4

3 回答 3

1

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

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

于 2012-04-05T14:52:28.147 回答
1

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

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

于 2012-04-05T14:55:20.583 回答
1

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

p.waitFor()确实等到p完成。循环有点无效,因为它只执行一次,所以你不妨删除它。

Sooo ...假设p在完成并退出之前会填满 br,waitFor则只需等待很短的时间,可能根本不需要。

为了更准确地了解正在发生的事情,需要后面的代码p,无论填充什么br以及这些事情是如何开始的。

于 2012-04-05T14:56:09.223 回答