2013-07-08 4 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; 
    } 
} 

Im работает это от Eclipse, и проблема заключается в том, что, когда я ударил FileNotFoundException виртуальная машина оленья кожа умирает. Я должен его вручную завершить. Я не понимаю, почему, хотя ...

+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 никогда не возвращается нормально.

Смежные вопросы