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。