【问题标题】:Why doesnt the JVM terminate in this case?为什么在这种情况下 JVM 不终止?
【发布时间】:2013-07-08 19:08:03
【问题描述】:

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

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 并没有死。我必须手动终止它。我不明白为什么...

【问题讨论】:

  • 请给我们看可执行代码。
  • @SotiriosDelimanolis 我向你展示了所有相关的代码。
  • 请向我们展示可编译和可执行的代码。如果这是伪代码,请务必说明。
  • @SotiriosDelimanolis 我认为这是不言而喻的,因为没有返回类型,gets 没有尝试/捕获它们,我对此做了一些工作评论....即使这样也足以解决我的问题。不需要完整的文件。

标签: java eclipse multithreading jvm resource-leak


【解决方案1】:

问题是当我遇到 FileNotFoundException 时

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

【讨论】:

  • 啊,是的,我忘了这样做。我只是在最后关闭了一个,并认为它就足够了。
【解决方案2】:

使用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 永远不会正常返回。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2021-08-09
      • 2017-11-26
      • 2010-12-29
      相关资源
      最近更新 更多