2011-08-15 129 views
36

我知道Deamon線程後臺線程。我們可以通過調用setDaemon(true)來創建我們自己的守護進程線程。守護線程什麼時候有用?

我的問題是:爲什麼和什麼時候我們需要創建我們的線程作爲守護線程?

回答

43

當所有正在運行的線程都是守護程序線程時,JVM將退出。所以想象你正在寫一個簡單的遊戲,在你的主要方法循環直到你決定退出。想象一下,在遊戲開始時,您會啓動一個線程,該線程將無休止地輪詢某個網站以觸發警報。當您決定結束遊戲時,您希望JVM退出。您不希望無限輪詢阻止遊戲結束。所以你讓這個輪詢線程成爲一個守護線程。

+0

在你的例子中,當用戶決定結束遊戲時,如果有用戶線程(而不是守護進程線程)仍在運行,那麼JVM塊是否會繼續運行? – Kal

+0

@Kal:是的,這是它的工作方式。用戶線程會阻止JVM關閉。 –

+1

是的:如果主要方法簡單地返回,JVM將繼續運行。當然,如果您調用System.exit,它將停止運行。 –

10

當所有「正常」線程終止時,Deamon線程將被JVM自動終止。普通線程永遠不會自動終止。

4

您希望通過基本用戶線程向用戶提供的沒有任何用戶交互的服務構成將用戶線程設置爲守護進程的主要用例。

因此,直到用戶線程存在JVM保證守護進程線程連續運行。你可以找到像GC,UI線程等例子。這些都是守護進程。

希望它有幫助。

1

正常情況下,程序在所有線程退出run()方法時終止。守護程序線程不會阻止程序終止,即使它們仍在運行,即執行run()

因此,如果您希望在線程仍在運行時不阻止程序終止,則應該使用守護進程線程。例如對於長期的週期性任務來說,這是典型的,但實際上非常依賴於您的計劃,設計和品味。

2

正如其他人所指出的,當該線程仍在運行時,守護線程不會阻止JVM在程序完成時退出。

一般來說,你不應該創建守護線程,除非你完全確定線程沒有副作用。由於您無法確定線程什麼時候停止,所以終結塊將不會運行,也不會解開任何棧。因此,請儘量避免在守護進程線程中使用IO操作,因爲它會破壞數據。

0

我用它們與計時器刪除不能立即刪除的文件。也就是說,我生成.exe文件,運行並刪除它們。但是有50%的機會失敗,看起來是因爲圖像仍然被終止進程阻止。只有在完成處理後才能可靠地刪除可執行映像。但是,你永遠不知道需要多長時間。因此,您設置.deleteOnExit而不是.delete。但是,你不想等到Java機器終止。它可能需要很長時間,並且不需要數百萬無用的愚蠢的.exe文件,您不再需要,掛在文件系統中。因此,您需要在計時器中安排executable.delete以在兩秒鐘後發生。然而,定時器不能是通常的線程。如果是這樣,即使沒有要刪除的文件,它也會阻止程序終止。然而,我可以很容易地使它成爲守護進程,因爲無論我的文件是否被刪除或不是由定時器都是非重要的 - 文件將被刪除,無論是通過守護進程或Java退出。我認爲這是守護進程的完美使用。

0

Java中的守護進程線程就像一個服務提供程序,用於其他線程或與守護進程線程在同一進程中運行的對象。守護線程用於後臺支持任務,只有在正常線程正在執行時才需要。如果普通線程沒有運行,剩餘的線程是守護線程,則解釋器退出。

當一個新的線程被創建時,它會繼承它父進程的守護進程狀態。普通線程和守護進程線程在退出時會發生什麼變化。當JVM停止任何剩餘的守護進程線程時,拋棄:finally塊不會被執行,堆棧不會被解除 - JVM剛剛退出。由於這個原因,應該謹慎地使用守護進程線程,並且將它們用於可能執行任何類型的I/O的任務是危險的。

+0

嘗試避免在守護進程線程中使用IO操作,因爲它可能會損壞數據。 –