2010-09-28 64 views
9

說我使用下面的方法每隔幾秒產生一個線程,每個線程都需要大約一秒的時間才能完成。完成的線程是否被刪除?Java線程在完成時被刪除

new Thread (new myRunnableClass()).start(); 
+2

如果這個過程和你的例子一樣簡單,並且每個線程都保證在下一個線程開始之前完成,那麼你可以重用一個線程嗎?我猜你的實際程序比這更復雜,但我只是在那裏提出建議。 – 2010-09-28 04:11:18

+0

@musicfreak:你知道,你剛剛提出了一個非常棒的觀點。出於某種原因,我一直在其他地方這樣做,我想這種情況看起來有些不同,但我想出了一種方法將這種技術應用於我的問題。謝謝! – Dave 2010-09-28 04:25:04

回答

6

線程完成後(大約在run()完成時),本地OS級線程會立即釋放,但線程對象像任何其他對象一樣存在,直到它變得無法訪問並且垃圾收集器感覺像在運行。

編輯:它也可能是有趣的知道Thread(在 Sun的 Oracle的實現,anywho)具有VM稱爲私有方法當線程退出時,其積極的NULL多個領域,其中包括一個指到由Thread(Runnable)構造函數設置的Runnable。因此,即使您保留對Thread的引用,完成執行後它不需要的內容也將被釋放,無論如何。

5

我不會稱之爲刪除。一旦線程完成,它將進入死態,準備好由JVM進行垃圾收集。

+3

...除非其他「活」數據結構維護對線程對象的引用。 OP中提出的例子不會成爲問題。 – Pointy 2010-09-28 04:20:36

+1

...但是這是一種模式,而不是當你想要'join()'這個線程,比如從'Runnable'中檢索一些結果時出現的模式,但是在你的例子中你不能這樣做,因爲' Runnable參考丟失。 – jbindel 2010-09-28 04:32:09

2

產生新線程是一個相當昂貴的過程。你想要的是一個線程池。有不同的方式去做 - here's one

+3

很久以前,在* nix系統(*即Linux *)中產卵線程*很貴,但在內核2.4(*或是2.6?*)中,它們改變了線程系統,因此產生新線程現在幾乎免費。請注意,在Windows環境中,產卵線程一直很便宜。也就是說,使用線程池是一件很明智的事情,因爲自然會有一些開銷,並且當大約一打時,你很少真的需要有十億個正在運行的線程。 – Esko 2010-09-28 06:34:32