我有一个控制器类,在其操作过程中,使用它维护的执行器来执行任务。如果我只是让gc在超出范围时清理控制器,那么JVM似乎不会死掉。我假设这是因为默认执行者没有超时,或者在很长一段时间后超时。
鉴于在控制器仍然可访问时永远不应该关闭执行程序,并且在控制器被垃圾收集后不会使用执行程序,使用终结器是否安全/可接受:
@Override
public void finalize() {
executor.shutdown();
}
我问,因为关于终结器的每一次讨论似乎都归结为,"除非我特别指出的非常具体的情况,否则不要使用。"
答案 0 :(得分:2)
执行程序没有死的原因是该线程不是守护程序线程,因此它使JVM保持活动状态。见Thread.setDaemon(boolean)
。
现在不是使用终结器的好时机。终结器只应用于清理本机资源(例如通过JNI访问的资源)。