2013-07-08 33 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從不正常返回。

相關問題