Java 如何重写类对象本身的finalize()方法?

Java 如何重写类对象本身的finalize()方法?,java,class,java-threads,finalize,Java,Class,Java Threads,Finalize,我的问题很简单。我有一个类,它有一个静态ThreadPoolExecutor对象。因此,这个threadpoolexecutor对象由类的所有实例共享。如果关闭整个应用程序,共享类对象将被垃圾收集。我希望threadpoolexecutor能够通过在其上调用shutdown并在此之后调用awaitTermination来完成其挂起的作业。这应该在类对象本身的finalize()方法中完成。我的问题是:如何重写类对象本身的finalize()方法?这可能吗 谢谢finalize()确实不推荐使用,

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

谢谢

finalize()
确实不推荐使用,因为它不可靠。但是,使用
JVM关闭钩子
可以使您受益匪浅。访问钩子中的静态池并尝试进行清理

用法示例:

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();
        }));

    }
}

即使您这样做了,您也不能保证GC将永远运行。我不建议在那里关机。“我如何重写类对象本身的finalize()方法?这可能吗?”-不,不可能。即使是这样,:“终结机制本身就是有问题的。终结可能会导致性能问题、死锁和挂起”。不要这样做。值得注意的是,一个
类在其
类加载器
也符合条件之前,是不符合收集条件的。那么,有没有其他方法来实现这一点呢?垃圾收集不会中断正在运行的作业或导致它们无法完成。您试图解决的实际问题是什么?关机挂钩不应参与长时间或阻塞操作。请参阅Javadoc。