当对象死亡时,不执行Finalizer方法

时间:2014-04-15 08:51:03

标签: java finalizer

我有一种情况,在构造对象时,静态变量增加1。 现在,我希望一旦对象死亡,这个变量就会减少。

覆盖finalize是一种方式,但这并不能确保一旦部分,并且也不能保证。

还有其他方法可以达到这个目的吗?

编辑:真正的问题是,我需要线程排序," Thread-1" "螺纹-2"等等,如果"线程-2"死了,你希望下一个创建的线程成为" Thread-2"

4 个答案:

答案 0 :(得分:1)

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
}

答案 1 :(得分:1)

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

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

对于资源,Closable接口是使用的模式。

答案 2 :(得分:1)

  

还有其他方法可以达到这个目的吗?

我认为一种巧妙的方法是实施AutoCloseable并在close()方法中进行整理。如果您的对象的使用方式不能确保调用close()方法,现代IDE会抱怨。它还可以使用try-with-resources语句:

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

答案 3 :(得分:-3)

只需输入System.gc();在新的Prac()。call()之后; line ..你的finalize将被调用..(不保证)你的代码看起来像这样......

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.

}