Eclipse中的Java进程问题

Nor*_*rog 3 eclipse multithreading process

这是我的代码:

final String run_tool ="cmd.exe /C pelda.exe";
final Process tool_proc = null;

Runnable doRun = new Runnable() {
    public void run() {
        try {
            tool_proc = Runtime.getRuntime().exec(run_tool);
            } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
};    

Thread th = new Thread(doRun);
th.start();

InputStream toolstr = tool_proc.getInputStream();
Run Code Online (Sandbox Code Playgroud)

在eclipse向tool_proc变量发出此警告消息之后:

无法分配最终的局部变量tool_proc,因为它是在封闭类型中定义的

我不知道为什么我的代码不起作用

请帮我

Pau*_*sma 6

final修改禁止,一旦它已经被设置改变的变量.凯文给出了一个很好的解释,说明为什么你不能在这种情况下使用它.

您选择的构造要求您在父类中引入一个字段并通过run()以下方式设置它:

class MyClass {
    Process tool_proc = null;

    void myFunction() {
        final String run_tool ="cmd.exe /C pelda.exe";
        Runnable doRun = new Runnable() {
            public void run() {
                try {
                    tool_proc = Runtime.getRuntime().exec(run_tool);
                    } 
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread th = new Thread(doRun);
        th.start();

        // tool_proc will be null at this point!
        InputStream toolstr = tool_proc.getInputStream();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我已经证明了tool_proc总是null在最后一行,因为线程在所有可能性中都没有完成它的执行!

你可以期待NullPointerExceptions!


看起来你要做的就是非常类似于关于异步捕获应用程序输出的这篇文章.这是一个很好的阅读,并解释了为什么传统方法可能会导致问题.我有一个非常类似于他们的实现StreamGobbler(文章第4页).