为什么不能通过将线程的引用设置为null并让垃圾收集器删除它来终止线程?这是一个像任何其他的对象,不是吗?
例如:
Thread t = new Thread(new Runnable() {
public void run() {
//...
}
}).start;
t = null;
答案 0 :(得分:3)
这是一个像任何其他的对象,不是 它?
不,不是。它代表一种非内存资源。您是否希望删除文件,因为代表它的对象是垃圾收集的?
实际上,当涉及到垃圾收集时,Thread
对象非常不像其他任何对象一样,因为线程本身就是可达性树的根,因此,表示正在运行的线程的Thread对象的字段(或堆栈上的局部变量)引用的任何对象按照定义不符合垃圾回收的条件。
答案 1 :(得分:2)
出于同样的原因,你不能只是将对JFrame的引用设置为null,以使窗口神奇地消失。 JVM具有对该线程的引用,因此即使您忘记了该线程,JVM也不会。您需要正确终止线程,最好是使其主函数结束。
答案 2 :(得分:2)
您只是将变量的值设置为null。
因此,问题是任何线程是否有效地引用了该Thread
对象。考虑新线程本身......它可以很容易地包括
System.out.println(Thread.currentThread());
如果Thread
对象被垃圾收集,您希望做什么?
对象只有在 no 对它们进行实时引用之后的某个时刻才会收集垃圾。任何实时线程都有自己的引用。
坦率地说,如果你必须确保 保留一个你刚刚开始的线程的引用,以防止它被突然停止,那将是一件痛苦的事。
答案 3 :(得分:2)
JLS section 12.6说:
“可到达的对象是任何可以从任何活动线程继续计算中访问的对象。”。
由此我们可以推断出活动线程是可隐式访问的,并且只要它们存活就不会被垃圾收集。但是,对Thread对象的可访问引用的存在与否是无关紧要的(正如@Jon Skeet所说),一个线程隐式地持有对其自己的Thread对象的引用,因此Thread.currentThread()
将起作用。