Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ThreadGroup受到批评?_Java_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

Java 为什么ThreadGroup受到批评?

Java 为什么ThreadGroup受到批评?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我知道目前使用Executors而不是ThreadGroup的做法: 处理线程的一般首选方法 从线程等捕获异常 然而,ThreadGroup固有的缺陷是什么(我听到过对该课程的模糊批评) 谢谢你的回答 PS.似乎没有回答这个问题。第73项对此进行了解释 线程组最初被设想为一种机制 用于出于安全目的隔离小程序。他们从未真正实现这一点 承诺,他们的安全重要性已经下降到了他们没有的程度 甚至在Java安全模型的标准工作[03]中也提到过 […]具有讽刺意味的是,ThreadGroupAPI在线程安

我知道目前使用Executors而不是ThreadGroup的做法:

  • 处理线程的一般首选方法
  • 从线程等捕获异常
然而,ThreadGroup固有的缺陷是什么(我听到过对该课程的模糊批评)

谢谢你的回答

PS.似乎没有回答这个问题。

第73项对此进行了解释

线程组最初被设想为一种机制 用于出于安全目的隔离小程序。他们从未真正实现这一点 承诺,他们的安全重要性已经下降到了他们没有的程度 甚至在Java安全模型的标准工作[03]中也提到过

[…]具有讽刺意味的是,
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比直接处理线程更可取,因此您几乎再也看不到线程组了。