我有一种情况,在构造对象时,静态变量增加1。 现在,我希望一旦对象死亡,这个变量就会减少。
覆盖finalize
是一种方式,但这并不能确保一旦部分,并且也不能保证。
还有其他方法可以达到这个目的吗?
编辑:真正的问题是,我需要线程排序," Thread-1" "螺纹-2"等等,如果"线程-2"死了,你希望下一个创建的线程成为" Thread-2"
答案 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.
}