对象终止时未执行终结器方法



在构造对象时,静态变量会增加1。现在,我希望这个变量在对象死后立即递减。

重写finalize是一种方法,但这不能确保一部分就,也不能保证。

还有其他方法可以做到这一点吗?

EDIT:真正的问题是,我需要线程排序,如"线程-1"、"线程-2"等。如果"线程2"失效,您希望下一个创建的线程成为"线程-2"

通常没有使用终结器方法的情况。也许在JNI。

即使是IO清理也不应该在finalize中调用,因为它不确定何时调用。

对于资源,可关闭接口是所使用的模式。

还有其他方法可以实现这一点吗

我认为一个巧妙的方法是实现AutoCloseable并在close()方法中进行整理。如果使用对象的方式不能确保调用close()方法,那么现代IDE会抱怨。它还将使用"尝试资源"语句:

try (A a = new A()) {
  // blah
}

GC可能根本不需要运行,因为代码非常简单。想象一下,如果每次对象符合GC条件时都运行GC?它会一直运行。

不要试图依赖那些没有保证的东西。

你想对你的物体计数做什么?也许还有一个更优雅的解决方案。

编辑:如果您对跟踪Threads而不仅仅是普通对象感兴趣,那么您可能更感兴趣的是了解Thread是否正在运行。您可以在不干扰GC的情况下跟踪它。

你想做的实际用例是什么?

这里有一个线程的例子(如果我理解你想做什么的话):

Thread[] myThreads = new Thread[10];
public Thread getNewThread(Runnable r) {
    for(int i = 0;i < myThreads.length;i++) {
        if(myThreads[i] == null || !myThreads[i].isAlive()) {
            // Found an unused index
            Thread t = new Thread(r);
            myThreads[i] = t;
            return t;
        }
    }
    return null; // Return null, because there aren't places available
}

只需放入System.gc();在new Prac().call()之后;线你的定稿会被调用。。(不能保证)你的代码会是这样的。。

public static void main(String[] args) throws InterruptedException
{
    new Prac().call(); //line 1
    System.gc();
    Thread.sleep(1000); //line 2 object a is eligible for GC.
}

最新更新