Java中的线程初始化为null

3
public class ThreadState {

    public static void main(String[] args){
            Thread t = new Thread(){
            public void run(){
                       // infinite loop
                       while (true) {
                        try {

                         Thread.sleep(1000);
                        }
                        catch (InterruptedException e) {
                        }

                        System.out.println("thread is running..."+Thread.currentThread().toString());
                       }

            }
        };
        t.start() ; 
        t = null ;
        while (true) {
              try {

              Thread.sleep(3000);
              }
              catch (InterruptedException e) {
              }
              System.out.println("thread is running..."+Thread.currentThread().toString());
        }   

    }
}

线程实例t被初始化为null,但仍然能够运行并在控制台上打印其详细信息。需要解释一下这是如何实现的。


t = null; 这行代码是否与此有关? - Makoto
你在启动它之后将其设置为null。问题出在哪里? - jn1kk
我认为 t = null 应该会影响线程的执行。因为线程没有引用,它应该会抛出一些异常..这就是我的疑惑所在。如果您认为我错了,那么您可以让我理解。 - Mridul Vishal
5个回答

11

Thread实例t被初始化为null

不,Thread变量被设置为空值。变量不是实例——务必确保您完全理解这一点。

更改变量的值不会影响现有的Thread对象。


5

t = null; 只是移除对 Thread 实例的引用,不会影响线程本身。

特别地,正在执行的 Thread 实例永远不会被垃圾回收。


1

您将t设置为null,这不会对线程本身做任何操作,它只是将null分配给存储实例引用的变量。

也许这可以帮助您:

如果您这样做会怎么样

Object t = new Thread() {...}
t.start
Thread t2= (Thread)t;
t="Orange";

你是否也期望魔法般的事情发生呢?如果您将t传递给另一个方法而不是在t2中存储另一个引用,会怎样呢?
t只是对线程引用的占位符,将某些内容分配给t与将null分配给下面的2号数字一样对线程产生影响。
Integer a = 2;
a=null;

1
@JonSkeet和其他人已经很好地解释了,当你设置t = null时,你根本没有改变正在运行的Thread,你只是改变了变量t。一旦线程已经启动,JVM将管理该线程,即使没有对它的引用,它仍将运行而不会被GC回收。

另外需要指出的是,在接下来的循环中,你正在进行以下操作:

System.out.println("thread is running..."+Thread.currentThread().toString());

这不是打印刚刚分叉的线程状态,而是打印当前线程 - 执行分叉的线程。这是运行main()方法的“主线程”。主线程可以完成,您分叉的线程将继续运行 - 保持JVM不退出。只有将您分叉的线程标记为守护线程,JVM才会在主线程完成时结束。


0

我认为Jon是正确的,即“更改变量的值不会对现有的线程对象产生任何影响。”

但实际上你需要的解释是:

在编程方法中,使用静态或全局内存局部于一个线程。因为通常进程中的所有线程共享相同的地址空间,这有时是不希望的。换句话说,静态或全局变量中的数据通常总是位于相同的内存位置,当被来自同一进程的线程引用时。每个线程都有自己的堆栈。

希望所给的概念性解释有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接