Java 对象死亡时未执行终结器方法
我有一种情况,在构建一个对象时,一个静态变量增加1。 现在,我希望这个变量在对象死后立即递减 覆盖Java 对象死亡时未执行终结器方法,java,finalizer,Java,Finalizer,我有一种情况,在构建一个对象时,一个静态变量增加1。 现在,我希望这个变量在对象死后立即递减 覆盖finalize是一种方法,但这并不能确保一开始就完成,也不能保证 有没有其他方法可以做到这一点 编辑:真正的问题是,我需要像“thread-1”和“thread-2”这样的线程排序。如果“thread-2”死了,您希望下一个创建的线程变成“thread-2”GC可能根本不需要运行,因为代码非常简单。想象一下,如果每次对象符合GC条件时GC都会运行?它将持续运行 不要试图依赖那些没有保证的东西 你打
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我的问题是“有没有其他方法可以实现这一点?”@JariSystem.gc()
也不能保证您这样做是为了解决一些实际问题吗?还是你只是出于兴趣而问?如果你有一个真正的问题,这几乎肯定不是解决问题的正确方法。也许你可以详细说明你真正想要实现的目标。例如,使类可关闭并使用try with resources可能会有所帮助。(取决于实际目标。)真正的问题是-它是一个线程,计数是工作者id,因此需要按顺序进行。对gc()
的调用可能会导致它被垃圾收集并最终确定。也可能不是。或者当你测试一次,而不是下一次的时候。或者它可能在不同的机器、JVM等上做不同的事情。
try (A a = new A()) {
// blah
}