2013-05-12 50 views
3

我有一個關於線程的問題。當我這樣做:Java「未激活」已執行/完成的線程

new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      //sth to do 
     } 

    }).start(); 

當run()中的所有代碼執行時會發生什麼?系統是否自動刪除線程或線程是否仍然保留在內存中?

THX &問候

回答

0

當一個線程的代碼執行完畢,線程停止。
Thread實例在獲取GC'd之前仍然存在,但實際的系統線程將不再存在。

0

如果您不使用任何自定義配置的線程池機制,您的線程將會死亡,並且Thread對象本身將有資格進行垃圾回收。

3

當一個線程完成其run()方法後,它將進入'死亡'狀態。然後堆棧中的下一個線程在運行。

死亡狀態:

「A線被認爲是當它的run()方法完成死者可能 仍然是一個可行的Thread對象,但它已不再是一個單獨的線程執行的 一次。一個線程死了,它永遠不會被帶回到 的生活!(整個「我看到死亡線程」的東西。)如果你在 上調用一個死的Thread實例的start(),你會得到一個運行時(不是編譯器)例外 而且它可能不需要火箭科學家告訴你,如果線程死了,它不再被認爲是活着的。「

1

Java的線程模型比這個稍微複雜一些。

基本上,java.lang.Thread只是一些數據的包裝,而不是一個過程本身。當你調用.start()方法時,創建一個本地線程並鏈接到你的Java線程。該工作由JVM使用內部數據結構完成(JavaThreadOSThread)。

一旦.run()方法完成,JVM將執行許多操作以刪除所使用的本地線程。因此,在處理列表中不會再看到此線程(例如,使用topps)。

但是,在堆中分配的對象和java.lang.Thread實例本身會保留在內存中,直到GC循環收集它們。

所以,總結一下:

  • 是的,JVM會刪除使用

  • 沒有,JVM不會刪除java.lang中的本地線程。線程實例使用

  • GC將最終收集這種情況下

欲瞭解更多信息,你應該讀的書「Java性能」查理亨特。它包含了很多關於這個主題的信息(和許多其他信息)。

希望有幫助!