Java Thread终止引用

时间:2011-04-23 08:45:02

标签: java multithreading reference terminate

为什么不能通过将线程的引用设置为null并让垃圾收集器删除它来终止线程?这是一个像任何其他的对象,不是吗?

例如:


Thread t = new Thread(new Runnable() {
  public void run() {
    //...
  } 
}).start;

t = null;

4 个答案:

答案 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()将起作用。