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