2014-01-29 55 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

相關問題