如果它在从 run() 返回后没有资格进行垃圾回收,是否应该将其引用设置为 null 来做到这一点?
明确将对象设置为 null(如果您确定将来不会使用它们)总是更好的做法,以使 GC 的工作更容易一些。
class Test {
protected void finalize() throws Throwable {
System.out.println("test finalized");
};
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
Test test = new Test();
try {
System.out.println(t.getState());
// t.join();
t = null;
test = null;
// System.out.println(t.getState());
Thread.sleep(500); // change this to say 2 or 3 sec i.e, until run() completes. The thread object will be finalized
System.gc();
System.out.println("gc call done..");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MyThread extends Thread {
protected void finalize() throws Throwable {
System.out.println("MyThread instance finalized..");
};
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i);
}
}
}
O/P:
case : 1 --> 如果调用 gc 时线程正在运行。
RUNNABLE
0
gc call done..
test finalized
1
2
3
4
case :2 --> IF 线程在调用 gc 时完成运行。
RUNNABLE
0
gc call done..
test finalized
1
2
3
4
MyThread instance finalized..
符合垃圾回收条件并不一定意味着该对象将从内存中删除。垃圾收集时由底层操作系统/JVM自行决定。但是如何确保(通过 Java 程序或外部工具)对象已完全从内存中删除?
在Java中,你只能说当object变成unreachable(不是GCed,unreachable)。 finalize() 将在您的 onjecy 变得无法访问时被调用。
如果一个线程在完成其 run() 方法后就被称为死了,为什么我仍然能够在同一个线程对象上执行 isAlive() 或 getState()?这两个调用分别返回 false 和 RUNNABLE。 -
线程可能已完成执行。但它仍然会处于一个状态。 终止状态。您正在线程实例上调用这些方法。所以,它仍然保存着一些状态数据。