Java 对象死亡时未执行终结器方法

Java 对象死亡时未执行终结器方法,java,finalizer,Java,Finalizer,我有一种情况,在构建一个对象时,一个静态变量增加1。 现在,我希望这个变量在对象死后立即递减 覆盖finalize是一种方法,但这并不能确保一开始就完成,也不能保证 有没有其他方法可以做到这一点 编辑:真正的问题是,我需要像“thread-1”和“thread-2”这样的线程排序。如果“thread-2”死了,您希望下一个创建的线程变成“thread-2”GC可能根本不需要运行,因为代码非常简单。想象一下,如果每次对象符合GC条件时GC都会运行?它将持续运行 不要试图依赖那些没有保证的东西 你打

我有一种情况,在构建一个对象时,一个静态变量增加1。 现在,我希望这个变量在对象死后立即递减

覆盖
finalize
是一种方法,但这并不能确保一开始就完成,也不能保证

有没有其他方法可以做到这一点


编辑:真正的问题是,我需要像“thread-1”和“thread-2”这样的线程排序。如果“thread-2”死了,您希望下一个创建的线程变成“thread-2”

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

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

你打算用你的物品计数做什么?也许有一个更优雅的解决方案

编辑: 如果您感兴趣的是跟踪
线程
,而不仅仅是普通对象,那么您可能更感兴趣的是了解
线程
是否正在运行。您可以跟踪这一点,而不会与GC发生冲突

您正在尝试的实际用例是什么

下面是一个线程示例(如果我理解您的意图):

Thread[]myThreads=新线程[10];
公共线程getNewThread(可运行的r){
for(int i=0;i
只需放置System.gc();在新的Prac()之后调用();行。。您的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.

}

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

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

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

有没有其他方法可以做到这一点

我认为一个简洁的方法是在
close()
方法中实现和整理。如果对象的使用方式不能确保调用
close()
方法,现代IDE会抱怨。它还将使用try with resources语句:

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

好啊还有其他方法吗?比如说,这是一个线程,计数是工作者id,所以需要按顺序。@Batty在循环中创建更多对象,并在下一个语句中使引用为空。您创建的对象越多,并使它们可用于GC,GC就越有可能execute@Stunner这不是一个真正的解决方案。@Batty你的意思是你需要“Thread-1”“Thread-2”等,如果“Thread-2”死了,你想让下一个创建的线程变成“Thread-2”?你试过运行
System.gc()吗
?@Stunner我的问题是“有没有其他方法可以实现这一点?”@Jari
System.gc()
也不能保证您这样做是为了解决一些实际问题吗?还是你只是出于兴趣而问?如果你有一个真正的问题,这几乎肯定不是解决问题的正确方法。也许你可以详细说明你真正想要实现的目标。例如,使类
可关闭
并使用try with resources可能会有所帮助。(取决于实际目标。)真正的问题是-它是一个线程,计数是工作者id,因此需要按顺序进行。对
gc()
的调用可能会导致它被垃圾收集并最终确定。也可能不是。或者当你测试一次,而不是下一次的时候。或者它可能在不同的机器、JVM等上做不同的事情。
try (A a = new A()) {
  // blah
}