繁体   English   中英

线程在java中初始化为null

[英]Thread initialized to null in java

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

不, Thread 变量设置为空值。 变量不是实例-这是值得务必确保你明白这一点。

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

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

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

您将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;

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

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

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

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

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

但你需要的实际解释是

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM