Java终结器:一个可接受的用例?

时间:2013-03-14 06:28:16

标签: java garbage-collection finalizer

我有一个控制器类,在其操作过程中,使用它维护的执行器来执行任务。如果我只是让gc在超出范围时清理控制器,那么JVM似乎不会死掉。我假设这是因为默认执行者没有超时,或者在很长一段时间后超时。

鉴于在控制器仍然可访问时永远不应该关闭执行程序,并且在控制器被垃圾收集后不会使用执行程序,使用终结器是否安全/可接受:

@Override public void finalize() { executor.shutdown(); }

我问,因为关于终结器的每一次讨论似乎都归结为,"除非我特别指出的非常具体的情况,否则不要使用。"

1 个答案:

答案 0 :(得分:2)

执行程序没有死的原因是该线程不是守护程序线程,因此它使JVM保持活动状态。见Thread.setDaemon(boolean)

现在不是使用终结器的好时机。终结器只应用于清理本机资源(例如通过JNI访问的资源)。