2014-01-29 57 views
1

我认为对象只存在于已定义的范围内。但是在这个程序中,在执行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(); 
    } 
} 
+3

你知道'Thread'是什么吗? – BackSlash

+0

它的工作按照你编码。 – Kick

+0

执行的路径? – user2555974

回答

6

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

这是一个错误的假设。对象存在,直到没有更多的引用(或直到它被垃圾收集,取决于您的视图)。您可以将引用存储到您定义的其他位置以外的其他位置,并根据您的需要使其生效。

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

+0

因此,如果没有参考,则无法在范围之后访问该对象。该对象只是存在于内存中而没有任何访问路径。我对吗 ? – user2555974

+0

@ user2555974编号*变量*具有范围,并且可以将对同一对象的引用放置在很多不同的变量中。只要某个对象的引用被某个活动线程保存,对象就不会被垃圾收集。 – chrylis

+0

对于大多数目的而言,对象永远不会存在,您只是无法访问它们。如果你有内存问题,你应该只需要考虑垃圾收集。 – immibis

0

参考按用户或(在你的情况下)JVM范围后死亡,对象只要正在使用他们生活。

+0

你是什么意思引用?你能给我一个例子吗 – user2555974

+0

他正在谈论的引用变量。 A ref = new A(); ref是一个参考变量。如果A是一个班级。 –

+0

因此,如果没有参考,则无法在范围之后访问该对象。该对象只是存在于内存中而没有任何访问路径。我对吗 ? – user2555974

相关问题