gpt4 book ai didi

java - 在 shutdownHook 中调用 finalize 无法工作

转载 作者:行者123 更新时间:2023-11-29 05:01:09 24 4
gpt4 key购买 nike

在下面的代码片段中,永远不会调用 finalize() 方法。但是当我在 addShutdownHook 中将 finalize() 替换为 close() 时。 finalize() 方法将被调用。是这里的错误吗?

public class Main {

public Main() {
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
try {
finalize();
} catch (Throwable e) {
System.out.println(e);
}
}
})
);
}

public static void main(String[] args) {
System.out.println("Enter main");
Main m = new Main();
m = new Main();
m = null;
System.out.println("Before System.exit(0);");
System.exit(0);
}

protected void finalize() {
System.out.println("Call finalize()");
}

protected void close() {
finalize();
}
}

最佳答案

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
finalize();
} catch (Throwable e) {
System.out.println(e);
}
}
}));

这会调用匿名 Runnable 实例的 finalize 方法(它什么都不做,因为它是继承的 Object#finalize()),不是你类定义的那个。您可以使用以下方式调用后者:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
Main.this.finalize();
} catch (Throwable e) {
System.out.println(e);
}
}
}));

更好的方法是重命名该方法以避免覆盖 Object#finalize(),当垃圾收集器检测到对象不再被引用时调用该方法。

另请注意,在您的代码中,您正在注册两个 关闭 Hook (构造函数被调用两次),因此方法finalize 将被调用两次。

关于java - 在 shutdownHook 中调用 finalize 无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32057580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com