cuốn sách gpt4 ai đã làm

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

In lại Tác giả: Walker 123 更新时间:2023-11-29 05:01:09 hai mươi bốn 4
mua khóa gpt4 Nike

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

public class Main {

public Main() {
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
thử {
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();
}
}

câu trả lời hay nhất

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

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

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

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

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

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

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress