2011-06-22 16 views
2

Java編程語言使用ThreadGroup管理線程訪問權限對方:是否知道在Java中有用的ThreadGroup?

線程組表示一組線程。另外,線程組還可以包含其他線程組。線程組形成一棵樹,其中除初始線程組以外的每個線程組都有一個父節點。

一個線程允許訪問有關自己的線程組的信息,但不能訪問有關其線程組的父線程組或其他任何線程組的信息

我想我理解它,但是這在任何方面都有用嗎?我想知道是否透露當前的ThreadGroup結構及其元素,因此線程和其他ThreadGroup從調試視角保存任何信息。

回答

4

我發現它很方便雖然它相當竊聽。對於提供管理內容b/c,創建的線程將添加到父線程的ThreadGroup(並且可以高效地枚舉)可能非常有用。它可以用來防止新的線程產生(但它沒有記錄或預期)。

不幸的是,ThreadGroup有不少bug, destroy()方法。

總之,如果你不打算寫中間件,不要打擾。如果你需要枚舉應用程序中的所有線程,使用Thread.getAllStackTraces().keySet(),但該方法有一個安全漏洞,但我不討論這部分。

編輯:我錯過了調試方面: 如果調試工具允許通過ThreadGroup進行樹視圖和分組(例如eclipse),ThreadGroups實際上對調試非常有用。如果您正確使用它,則當前調試模塊/ mbean/etc中的所有線程都應位於同一組中。它允許更容易跟蹤線程泄漏(與其他數百個線程相比)

+0

destroy方法有哪些錯誤? –

0

ThreadGroup通常被認爲是失敗的實驗。如果您的代碼需要與Java PlugIn或Java WebStart環境交互,那麼瞭解它就很有用。否則,我不會真的打擾。

0

首先,這非常沒有實際意義。很少有應用程序使用線程組,因此應用程序線程幾乎總是以同一個線程組結束。

其次,我認爲你引用的限制是指沙盒應用程序。根據ThreadGroup javadoc的其他部分,枚舉線程線程組中的線程的能力由安全管理器控制。第三,如果一個應用程序是沙盒,那麼限制其對沙箱外的東西的知識總是一個好主意。如果沒有,那麼沒有什麼可以隱藏的。

最後,如果你使用的是調試器,它將有權訪問根線程組,因此不會受到這個限制......如果它真的存在。同樣,「主」線程將位於根線程組中。


正如@湯姆Hawtin說,線程組被認爲是一個失敗的實驗,特別是因爲它們被設計爲支持(使用Thread.stop,Thread.destroy等)的賬戶已被棄用的方法其不安全。

相關問題