2013-07-08 31 views
2

我想我的代码中有一个线程泄漏,但我不知道为什么。这里的代码 -为什么在这种情况下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不死。我必须手动终止它。我不明白为什么,但...

+1

请向我们展示可执行代码。 –

+0

@SotiriosDelimanolis我向你展示了所有相关的代码。 –

+0

请向我们展示可编译和可执行的代码。如果这是为了伪代码,请确保您陈述它。 –

回答

4

问题是,当我打了一个FileNotFoundException异常

当你点击这个例外似乎异常处理程序没有关闭ExecutorService。如果你没有关闭ExecutorService,那个线程池将停留在那里。

+0

啊,是的,我忘了这么做。我只是把一个关闭在最后,并认为这已经足够了。 –

0

异常在单独的线程中抛出。在es.call()中产生的线程应该死亡,但不是主线程(或运行foo()的线程)。 而JVM仍在运行,因为主线程并未死亡。

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从不正常返回。

相关问题