【发布时间】:2012-09-23 00:21:59
【问题描述】:
类ThreadPoolExecutor 中的Finalize 方法如下所示。
protected void finalize() {
shutdown();
}
考虑下面的程序,其中线程永远不会终止
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new Runnable() {
@Override
public void run() {
try {
new SynchronousQueue<String>()
.put("will never get removed");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
executorService = null;
System.gc();
}
在这种情况下,shutdownNow 会是比shutdown 更好的选择,至少 JVM 在这种情况下可以退出。
更新:
对于finalize 调用shutdown 方法的唯一可能解释是,如果程序员没有显式调用它,它将在GC 作为防御机制时被调用。我发现这种机制存在缺陷,因为在上述情况下 JVM 不会被终止。
【问题讨论】:
标签: java executorservice