クラス内の 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 は終了しないため、このメカニズムに欠陥があることがわかります。