线程在java中初始化为null

时间:2012-05-18 15:16:11

标签: java multithreading

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

5 个答案:

答案 0 :(得分:11)

  

线程实例t初始化为null

不,Thread 变量设置为空值。变量不是实例 - 值得让完全确保你理解它。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分: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;

答案 3 :(得分:1)

@JonSkeet和其他人已经解释说,然后你设置t = null你根本没有改变正在运行的Thread,你只是在改变变量t。一旦线程启动,JVM就会管理线程,所以即使没有引用它,它仍然会运行而不是GC。

另一点需要指出的是,在接下来的循环中,你正在做:

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

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

答案 4 :(得分:0)

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

但您需要的实际解释是

  

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

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