2012-04-05 48 views
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循环仍然被打中。

线程一直是我最薄弱的一点,显然我只是没有完全掌握这里发生的事情。代码工作虽然所以我想它是有效的。虽然也许它没有按照它应该的方式编码?无论如何,非常感谢帮助,谢谢。

UPDATE

感谢您的信息所有。有意义的是while(running)循环没有做任何事情。我将删除它。我在上面添加了其余的代码,以前我没有提供给更多的上下文,以防任何人有任何进一步的添加。

+0

是否有任何答案给你你正在寻找的解决方案/解释,或者有什么你想要的? – Attila 2012-04-05 15:53:31

+0

是的,我想他们确实回答了这个问题。好的,我会将其中一个标记为已接受的答案。 – cardician 2012-04-05 16:24:04

回答

1

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

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

Sooo ...假设p是什么填满br直到它完成并退出,waitFor将只需要等很短的时间,可能根本不会。

为了更清楚地了解究竟发生了什么事情,人们需要p后面的代码,无论是填充br还是这些东西如何开始。

1

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

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

1

p.waitFor()是等待进程终止的线程,它不会等待直到线程结束。如果线程中断(意味着程序的另一部分引用线程选择在其上调用interrupt(),通常是因为程序正在关闭),在它正在等待终止的进程之前,则p.destroy()杀死进程。 waitFor的while循环没用。

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

相关问题