我认为我的代码中存在线程泄漏,但我不确定原因。这是代码-
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仍然在运行,因为主线程没有死。