Java 为什么ThreadGroup受到批评?
我知道目前使用Executors而不是ThreadGroup的做法:Java 为什么ThreadGroup受到批评?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我知道目前使用Executors而不是ThreadGroup的做法: 处理线程的一般首选方法 从线程等捕获异常 然而,ThreadGroup固有的缺陷是什么(我听到过对该课程的模糊批评) 谢谢你的回答 PS.似乎没有回答这个问题。第73项对此进行了解释 线程组最初被设想为一种机制 用于出于安全目的隔离小程序。他们从未真正实现这一点 承诺,他们的安全重要性已经下降到了他们没有的程度 甚至在Java安全模型的标准工作[03]中也提到过 […]具有讽刺意味的是,ThreadGroupAPI在线程安
- 处理线程的一般首选方法
- 从线程等捕获异常
ThreadGroup
API在线程安全方面很弱
立场。要获取线程组中活动线程的列表,必须调用
enumerate
方法,该方法将足够大的数组作为参数
所有活动线程。activeCount
方法返回活动计数的数目
线程组中的线程,但不能保证此计数仍为
一旦分配了数组并将其传递给enumerate
方法,则精确。如果
线程计数已增加且数组太小,enumerate
方法
静默忽略阵列中没有空间的任何线程
列出线程组的子组的API也有类似的缺陷。虽然
他们说,这些问题本可以通过添加新方法来解决
没有,因为没有真正的需要:线程组已经过时了
在1.5版之前,有一小部分功能可用
仅使用ThreadGroup
API:ThreadGroup.uncaughtException
方法是线程抛出未捕获异常时获得控制的唯一方法。
例如,此功能对于将堆栈跟踪定向到应用程序非常有用-
特定日志。但是,从1.5版开始,相同的功能可用
使用线程
的setUncaughtExceptionHandler
方法
总之,线程组没有提供太多有用的功能,
他们提供的许多功能都有缺陷。线程组
最好将其视为一次失败的实验,你应该忽略它们
存在。如果设计一个处理逻辑线程组的类,那么
可能应该使用线程池执行器(第68项)
啊,我讨厌人们说“不要使用ThreadGroup”。这就像说“不要使用线程”。一个线程有一个线程组,无法绕过它,所以除非你想要一个没有线程的程序,否则你使用的是线程组。我同意我们需要一个问题来解决何时、如何以及为什么不使用它们。+1因为马克·彼得斯陈述的原因,并且因为这个问题是这样做的好工具。@matt b:在没有明确答案的情况下选择更多的意见。@MarkPeters这是约书亚的建议:“线程组最好被视为一个失败的实验,你应该忽略它们的存在。如果你设计了一个处理线程逻辑组的类,你可能应该使用线程池执行器(第68项)。“那么你能给我们举一些关于何时、如何以及为什么使用线程组的例子吗?@sheidaei:这是几年前的事,但我的评论并没有说我们应该使用线程组(用于任何事情)。我想说的是,通用(当时)规则“不使用ThreadGroup”本身既没有用处也没有启发性,因为它没有解释为什么,因为所有线程实际上都以某种方式使用ThreadGroup。因此,这个问题是一个很好的问题,可以更详细地讨论(即“不要使用ThreadGroup来完成X,而要使用Y”)。这就是我要说的。谢谢你的引用。那么我是否正确地理解了我们在实践中应该完全避免ThreadGroup,尽管它仍然存在于线程方法中:start()和init(ThreadGroup g,Runnable target,String name,long stackSize),后者是从Thread()调用的构造函数并始终构建ThreadGroup?感谢您标记CW和参考。最终购买了这本书,但还没有到那一步。
uncaughtException
功能实际上是我好奇的最后一点。@Max通用库代码应该仍然知道它是在哪个ThreadGroup
中创建AD的。因此,出于某些目的,您仍然必须处理它。@Max,通常是的(有一些例外,如@Tom所述)。请注意,由于Executor比直接处理线程更可取,因此您几乎再也看不到线程组了。