为什么在范围之后线程对象不被销毁?

时间:2014-01-29 09:27:07

标签: java multithreading scope

我认为对象只存在于已定义的范围内。但是在这个程序中,执行thtest方法后,t1线程的对象仍然存在,我可以在输出中看到“hi”和“bye”。

public class apples {
    public static void main(String args[]){
        int b =1;
        navid n = new navid();
        n.thtest(); 
        while (b==1){ System.out.println("bye"); }  
    }
}

public class navid {
    int a=1;
    public void thtest (){
        Runnable te = new Runnable() {
            public void run(){
                try{
                    while (a==1){ System.out.println("hi");}
                }catch(Exception e){}
            }   
        };
        Thread t1 = new Thread (te);
        t1.start();
    }
}

2 个答案:

答案 0 :(得分:6)

  

我认为这些对象只存在于已经定义的范围内。

这是一个错误的假设。对象存在,直到不再有对它们的引用(或者直到它被垃圾收集,具体取决于您的视图)。您可以将对象的引用存储在除定义之外的其他位置,并且只要您愿意,就可以将它们存储起来。

线程有些特殊,JVM将跟踪一个线程,它将继续运行,直到它的run()方法结束,即使你的代码不包含对Thread对象的引用。

答案 1 :(得分:0)

引用在范围之后死亡,对象只要它们被用户或(在您的情况下)JVM使用它们就会生效。