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 .. 它仍然能够运行并在控制台上打印其详细信息。需要对此作出解释

4

5 回答 5

11

线程实例 t 初始化为 null

不,Thread 变量设置为空值。变量不是实例——绝对确保你理解这一点是值得的。

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

于 2012-05-18T15:17:54.197 回答
5

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

特别是,执行Thread实例永远不会被 GC。

于 2012-05-18T15:17:48.347 回答
1

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

也许这会有所帮助:

如果你这样做怎么办

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

你会期待神奇的事情发生吗?如果您将 t 传递给另一个方法而不是在 t2 中存储另一个引用怎么办?

t 只是对线程的引用的占位符,将某些内容分配给 t 对线程的影响与将 null 分配给下面的 a 对数字 2 的影响一样大。

Integer a = 2;
a=null;
于 2012-05-18T15:17:38.093 回答
1

@JonSkeet 和其他人已经很好地解释了,然后你设置t = null你根本没有改变运行Thread,你只是在改变变量t。一旦线程启动,JVM 就会管理线程,因此即使没有对它的引用,它仍然会运行并且不会被 GC 处理。

需要指出的另一件事是,在接下来的循环中,您正在执行以下操作:

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

不是打印出您刚刚分叉的线程的状态,而是打印出当前线程——进行分叉的线程。这是运行该main()方法的“主线程”。主线程可以完成,并且您分叉的线程将继续运行——阻止 JVM 退出。只有当您分叉的线程被标记为守护线程时,JVM 才会在主线程完成时完成。

于 2012-05-18T15:26:24.997 回答
0

我认为 Jon 是正确的,即“更改变量的值根本不会影响现有的 Thread 对象。”

但你需要的实际解释是

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

希望给出的概念解释是有帮助的。

于 2012-05-18T16:23:16.223 回答