为什么ThreadGroup受到批评?
我知道目前使用Experator而不是ThreadGroup的做法:
- 处理线程的一般首选方式
- 从线程中捕获异常等...
但是,ThreadGroup本身的固有缺陷是什么(我听说过对该类的模糊批评)?
感谢您的回答。
PS.这似乎并没有回答这个问题。
我知道目前使用Experator而不是ThreadGroup的做法:
但是,ThreadGroup本身的固有缺陷是什么(我听说过对该类的模糊批评)?
感谢您的回答。
PS.这似乎并没有回答这个问题。
这在《有效的 Java 第 2 版》第 73 项中进行了解释。
线程组最初被设想为一种出于安全目的隔离小程序的机制。他们从未真正兑现过这个承诺,他们的安全重要性已经下降到在Java安全模型的标准工作中甚至没有提到他们[Gong03]的程度。
[...]具有讽刺意味的是,从线程安全的角度来看,API很弱。若要获取线程组中活动线程的列表,必须调用该方法,该方法将足够大以容纳所有活动线程的数组作为参数。该方法返回线程组中活动线程的数目,但不能保证在分配数组并将其传递给该方法后,此计数仍然准确。如果线程计数增加并且数组太小,则该方法将静默地忽略数组中没有空间的任何线程。
ThreadGroup
enumerate
activeCount
enumerate
enumerate
列出线程组子组的 API 也存在类似的缺陷。虽然这些问题可以通过添加新方法来解决,但它们还没有,因为没有真正的需要:线程组已经过时了。
在 1.5 版之前,有一小段功能只能通过 API 使用:当线程引发未捕获的异常时,该方法是获得控制的唯一方法。例如,此功能可用于将堆栈跟踪定向到特定于应用程序的日志。但是,从 1.5 版开始,相同的功能可用于 的方法。
ThreadGroup
ThreadGroup.uncaughtException
Thread
setUncaughtExceptionHandler
总而言之,线程组在有用的功能方面并没有提供太多,而且它们提供的大部分功能都是有缺陷的。线程组最好被视为不成功的实验,您应该忽略它们的存在。如果设计一个处理线程的逻辑组的类,则可能应使用线程池执行程序(项 68)。