为什么JVM在这种情况下不终止



我认为我的代码中存在线程泄漏,但我不确定原因。这是代码-

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不会死。我不得不手动终止它。我不明白为什么。。。

问题是当我遇到FileNotFoundException 时

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

使用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();
}

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

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

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

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

异常在一个单独的线程中抛出。es.call()中的线程派生应该死,但主线程(或运行foo()的线程)不应该死。JVM仍然在运行,因为主线程没有死。

相关内容

  • 没有找到相关文章

最新更新