2

我想我的代码中有线程泄漏,但我不知道为什么。这是代码 -

foo(String solutionFileName, String SubmissionFileName){
    ExecutorService e = Executors.newFixedThreadPool(
    Future<BufferedReader> f1 = e.submit(new Builder(solutionFileName));
    Future<BufferedReader> f2 = e.submit(new Builder(submissionFileName));
    BufferedReader b1=f1.get();
    BufferedReader b2=f2.get();
    //do a little work
    e.shutdown();
}

class Builder{
    Builder(String fileName){this.fileName=fileName;}
    public BufferedReader call() throws FileNotFoundException{
        return new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
    String fileName;
    }
}

我在 Eclipse 上运行它,问题是当我遇到 FileNotFoundException 时,JVM 并没有死。我必须手动终止它。我不明白为什么...

4

3 回答 3

4

问题是当我遇到 FileNotFoundException

当您遇到此异常时,您的异常处理程序似乎没有关闭ExecutorService。如果您不关闭ExecutorService,该线程池将留在那里。

于 2013-07-08T19:09:29.650 回答
1

使用try/finally块:

ExecutorService e = Executors.newFixedThreadPool(10);
try {
    Future<BufferedReader> f1 = e.submit(new Builder(solutionFileName));
    Future<BufferedReader> f2 = e.submit(new Builder(submissionFileName));
    BufferedReader b1=f1.get();
    BufferedReader b2=f2.get();
    //do a little work
} finally {
    e.shutdown();
}

shutdown无论try块如何退出,这都会导致调用被执行。您的代码正在引发异常,这会导致该e.shutdown()行被跳过(异常通常会导致所有代码执行停止)。通过添加finally,您可以保证无论try块如何退出,e.shutdown()都会调用 。

有一个例外。如果你这样做:

try {
    System.exit(0);
} finally {
    System.out.println("Finally block");
}

"Finally Block"永远不会被打印,因为System.exit永远不会正常返回。

于 2013-07-08T19:16:33.807 回答
0

异常在单独的线程中引发。应该死的线程es.call()应该死而不是主线程(或运行的线程foo())。而且JVM还在运行,因为主线程没有死。

于 2013-07-08T19:14:58.487 回答