說我使用下面的方法每隔幾秒產生一個線程,每個線程都需要大約一秒的時間才能完成。完成的線程是否被刪除?Java線程在完成時被刪除
new Thread (new myRunnableClass()).start();
說我使用下面的方法每隔幾秒產生一個線程,每個線程都需要大約一秒的時間才能完成。完成的線程是否被刪除?Java線程在完成時被刪除
new Thread (new myRunnableClass()).start();
線程完成後(大約在run()
完成時),本地OS級線程會立即釋放,但線程對象像任何其他對象一樣存在,直到它變得無法訪問並且垃圾收集器感覺像在運行。
編輯:它也可能是有趣的知道Thread
(在
Sun的
Oracle的實現,anywho)具有VM稱爲私有方法當線程退出時,其積極的NULL多個領域,其中包括一個指到由Thread(Runnable)
構造函數設置的Runnable
。因此,即使您保留對Thread
的引用,完成執行後它不需要的內容也將被釋放,無論如何。
產生新線程是一個相當昂貴的過程。你想要的是一個線程池。有不同的方式去做 - here's one。
很久以前,在* nix系統(*即Linux *)中產卵線程*很貴,但在內核2.4(*或是2.6?*)中,它們改變了線程系統,因此產生新線程現在幾乎免費。請注意,在Windows環境中,產卵線程一直很便宜。也就是說,使用線程池是一件很明智的事情,因爲自然會有一些開銷,並且當大約一打時,你很少真的需要有十億個正在運行的線程。 – Esko 2010-09-28 06:34:32
如果這個過程和你的例子一樣簡單,並且每個線程都保證在下一個線程開始之前完成,那麼你可以重用一個線程嗎?我猜你的實際程序比這更復雜,但我只是在那裏提出建議。 – 2010-09-28 04:11:18
@musicfreak:你知道,你剛剛提出了一個非常棒的觀點。出於某種原因,我一直在其他地方這樣做,我想這種情況看起來有些不同,但我想出了一種方法將這種技術應用於我的問題。謝謝! – Dave 2010-09-28 04:25:04