【问题标题】:How do i override the finalize() method of the class object itself?如何覆盖类对象本身的 finalize() 方法?
【发布时间】:2020-05-04 18:22:57
【问题描述】:

我的问题很简单。我有一个具有静态 ThreadPoolExecutor 对象的类。因此,该 threadpoolexecutor 对象由该类的所有实例共享。如果我要关闭整个应用程序,共享类对象将被垃圾收集。我希望 threadpoolexecutor 能够通过调用 shutdown 和之后调用 awaitTermination 来完成其挂起的工作。这应该在类对象本身的finalize() 方法中完成。我的问题是:我如何覆盖类对象本身的finalize() 方法?这甚至可能吗?

谢谢

【问题讨论】:

  • 即使你这样做了,你也不能保证 GC 会运行。我不建议在那里关闭。
  • "我如何重写类对象本身的 finalize() 方法?这甚至可能吗?" - 不。不,不是。即使是这样,Object::finalize is deprecated since Java 9:“终结机制本身就有问题。终结会导致性能问题、死锁和挂起”。只是不要这样做。
  • 值得注意的是,Class 在其ClassLoader 也符合收集条件之前不符合收集条件。
  • 好的,那么还有其他方法可以实现吗?
  • 垃圾回收不会中断正在运行的作业或导致它们无法完成。您要解决什么实际问题?

标签: java class java-threads finalize


【解决方案1】:

finalize() 真的不推荐,因为它不可靠。但是,您可以从使用JVM ShutdownHooks 中受益。访问钩子内的静态池并尝试进行清理。

示例用法:

public class ShutdownTest {

    static PrintWriter writer = new PrintWriter(System.out);

    public static void main(String[] args) throws InterruptedException {

        writer.println("Application Started");
        writer.flush();

        Thread.sleep(2000);

        Runtime.getRuntime().addShutdownHook(new Thread(() ->{
            writer.println("Application shutdown started");
            writer.println("Closing resource");
            writer.close();
        }));

    }
}

【讨论】:

  • 关闭挂钩不应进行长时间或阻塞操作。请参阅 Javadoc。
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 2023-03-12
  • 1970-01-01
  • 2016-10-20
  • 2013-04-13
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多