【问题标题】:Java - finalize() does not called [duplicate]Java - finalize() 不调用[重复]
【发布时间】:2017-09-19 00:31:52
【问题描述】:

我正在编写一个程序,所以我遇到了问题。

为什么不调用finalize()方法?

public class ExOne extends Thread {
    private String sD;
    ExOne(String startUp, String shutDown){
        System.out.println("Start-up message is: " + startUp);
        sD = shutDown;
    }
    public void finalize() {
        System.out.println("Shut-down message is: " + sD);
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 3; i++) {
                System.out.println("Message " + String.valueOf(i));
                Thread.sleep(1000);
            }
        }
        catch (InterruptedException e){
            System.out.println(e);
        }
        System.gc();
        System.runFinalization();
    }
}

public class Main {
    public static void main(String[] args) {
        ExOne exOneobj = new ExOne("start", "stop");
        exOneobj.start();
    }
}

所以输入是:

Start-up message is: start
Message 0
Message 1
Message 2

Process finished with exit code 0

并且没有消息“关闭消息已停止”。 请帮帮我。

怎么了?

【问题讨论】:

  • 你的程序中没有任何地方exOneobj 超出范围,所以它永远不会被垃圾收集,所以finalize() 永远不会运行。
  • finalize() 在垃圾收集对象 (exOneobj) 以释放内存空间之前执行,但在您的程序中,当run 退出时exOneobj 仍在内存中,但程序结束以便@ 987654329@未被调用

标签: java multithreading finalize


【解决方案1】:

finalize() 在垃圾收集器清除对象时执行,在您的情况下,它永远不会发生,因为程序在exOneobj 有机会被清除之前结束。

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 2011-07-07
    • 2013-11-21
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多