2009-10-30 60 views

回答

19

使用ThreadGroup在具有數千個線程的大型應用程序服務器中可能是一種有用的診斷技術。如果你的線程在邏輯上組合在一起,那麼當你得到堆棧跟蹤時,你可以看到有問題的線程是哪個組的一部分(例如「Tomcat線程」,「MDB線程」,「線程池X」等),可以是在追蹤和解決問題方面有很大的幫助。

+2

我認爲在過去,我不認爲它給你任何東西,只是適當地命名線程。但是,如果您不能修改線程名稱,或者您有一個監視線程活動的工具,那麼這就是另一回事。 – 2009-10-30 11:13:37

+3

公平點,但附加結構可能很有用,例如聚合線程組的CPU使用率。 – skaffman 2009-10-30 11:17:35

+1

由於這個特殊原因,我在一個非常大的企業應用程序中使用它們。我本來可以自己跟蹤他們,但是這會迫使我編寫相當多的代碼來管理我的收藏內容,當線程完成,死亡等。 – Fredrik 2009-10-30 11:20:09

3

簡短的回答是 - 不,不是。使用一個好處很少。

要稍微擴展,如果要將工作線程分組在一起,使用ExecutorService會更好。如果您想快速計算概念組中有多少線程處於活動狀態,則仍需要單獨檢查每個線程(因爲ThreadGroup.activeCount()是一種估計,意味着如果代碼的正確性取決於其輸出,則無用) 。

我甚至可以說,除了語義分隔之外,你最近從一個人那裏得到的唯一東西是作爲一個組的一部分構造的線程將拾取守護進程標誌和一個合理的名字根據他們的小組。使用它作爲在構造函數調用中填充幾個基元的快捷方式(通常您只需要編寫一次,但可能是在循環和/或方法調用中啓動線程)。

所以 - 我真的沒有看到任何令人信服的理由來使用它。幾個月前,我專門嘗試過,但失敗了。

編輯 - 我假設如果您使用SecurityManager運行並且想斷言只有同一組中的線程可以相互中斷,那麼一個潛在的用途是。即使這是非常有邊界的,因爲默認實現總是返回true,對於線程任意非系統線程組。如果你正在實現你自己的SecurityManager,你可以讓它根據任何其他標準做出決定(包括在創建集合時存儲線程的典型技術)。

+0

如何在創建集合時將「線程」存儲在集合中。我看不到你怎麼知道什麼時候創建線程。 – 2009-10-30 11:26:45

+0

你去'新線程(...)'的位。 :-)由於一個線程只能在構造時被明確地分配給一個組,因此假設該OP的代碼明確地創建它們是合理的。如果他不是自己調用構造函數,他無論如何都不能改變線程組。 – 2009-10-30 12:09:42

14

請勿將ThreadGroup用於新代碼。改爲使用Executor東西java.util.concurrent

+3

爲什麼?這有什麼好的理由嗎? – ShiDoiSi 2011-10-01 08:26:35

+3

Effective Java 2nd Ed。項目73.令人遺憾的是,我認爲國際社會對目前的這個問題的信息投票失敗。 – 2011-10-03 01:03:04

+3

這似乎沒有回答這個問題,即「我爲什麼要使用它?」不是「我應該使用它嗎?」 – immibis 2015-06-15 14:35:06

8

對提供的答案有一些免費(6年前左右)。但是,雖然併發API提供了許多構造,但ThreadGroup可能仍然有用。它提供以下功能:

  1. 線程的邏輯組織(用於診斷目的)。
  2. 您可以interrupt()組中的所有線程。 (中斷完全正常,不像suspend(),resume()stop())。
  3. 您可以設置組中線程的最大優先級。 (不知道這有多廣泛,但你有它)。
  4. ThreadGroup設置爲守護進程。 (所以添加到它的所有新線程將是守護進程線程)。
  5. 它允許您覆蓋它的uncaughtExceptionHandler,這樣如果組中的一個線程拋出一個異常,您就有一個回調來處理它。
  6. 它爲您提供了一些額外的工具,例如獲取線程列表,您擁有多少活動工具等等。有一組工作線程或某種線程池時很有用。
1

很好answer for @skaffman。我想再添加一個優勢:

線程組可幫助操縱一次定義的所有線程。

例如:您可以使用單個方法調用來啓動或中斷組內的所有線程。

+0

暫停是一個不推薦的選項,因爲您也可以在@jbx答案中閱讀 – jontro 2017-06-22 00:38:40

相關問題