2010-07-16 74 views
23

我知道使用Executors,而不是線程組的現行做法:爲什麼ThreadGroup被批評?

  • 通常首選方法來處理線程
  • 捕捉來自螺紋等例外...

然而,是什麼是ThreadGroup的固有這樣的缺陷(我聽說過該類的模糊批評)?

感謝您的回答。

PS。 this似乎無法回答這個問題。

+6

argh我討厭它,當人們說「不要使用ThreadGroup」。這就像說「不要使用線程」。一個線程擁有一個ThreadGroup,沒有任何解決方法,所以除非你想要一個沒有線程的程序,否則你正在使用ThreadGroups **。我同意我們需要一個問題來解決*何時,如何和爲什麼*不使用它們。 – 2010-07-16 14:15:20

+0

+1,原因是馬克·彼得斯說,因爲這個問題是一個很好的工具。 – 2010-07-16 14:29:25

+0

爲什麼這個社區Wiki? – 2010-07-16 16:21:11

回答

30

這在Effective Java 2nd Ed.解釋,項目73

線程組最初被設想爲一個機制 爲安全起見隔離的小程序。他們從來沒有真正履行過這個承諾,他們的安全重要性已經減弱到甚至不是在Java安全模型標準工作[Gong03]中提到的 。

[...]具有諷刺意味的是,從線程安全 的角度來看,ThreadGroup API很弱。要獲得線程組中活動線程的列表,您必須調用方法,該方法使用足夠大的數組作爲參數,以保存所有活動線程的 。 activeCount方法返回線程組中活動的 線程的數量,但不能保證一旦數組已分配並傳遞給enumerate方法,此計數仍將爲 。如果 線程數已增加且數組太小,則方法 將靜默地忽略數組中沒有空間的任何線程。

列出線程組的子組的API也有類似的缺陷。雖然 這些問題本來可以通過增加新的方法來解決,但是它們 還沒有,因爲沒有真正的需要:線程組已經過時

之前釋放1.5,有一個小片的功能是可用 只與ThreadGroup API:所述ThreadGroup.uncaughtException 方法是增益控制當線程拋出未捕獲的異常的唯一途徑。 此功能很有用,例如,可將堆棧跟蹤指向特定日誌的應用程序。然而,從版本1.5起,相同的功能可用 與ThreadsetUncaughtExceptionHandler方法。

總而言之,線程組不提供很多有用的功能,它們提供的許多功能都是有缺陷的。線程組 最好看作是一個不成功的實驗,你應該簡單地忽略他們的 的存在。如果您設計了一個處理邏輯線程組的類,那麼您應該使用線程池執行程序(條目68)。

+0

感謝您的報價。所以我正確理解我們在實踐中應該完全避免使用ThreadGroup,儘管它仍然存在於Thread方法內部:start()和init(ThreadGroup g,Runnable target,String name,long stackSize),後者被稱爲Thread()構造函數並始終構建ThreadGroup? – Max 2010-07-16 14:27:48

+0

感謝您爲CW和參考。最後買了這本書,但還沒有那麼遠。 'uncaughtException'功能實際上是我很好奇的最後一點。 – 2010-07-16 14:28:46

+0

@Max通用庫代碼仍應該知道它正在創建哪個'ThreadGroup'。因此,出於某種目的,您仍然需要處理它。 – 2010-07-16 15:30:03