类中的 Finalize 方法ThreadPoolExecutor
如下所示。
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();
}
在这种情况下,至少 JVM 在这种情况下可能退出shutdownNow
是更好的选择。shutdown
更新:
finalize
为什么调用方法的唯一可能解释shutdown
是,如果程序员没有显式调用它,它将被调用,而 GC 作为一种防御机制。我发现这种机制存在缺陷,因为在上述情况下,JVM 不会被终止。