不推荐使用stop()
,resume()
,suspend()
等许多方法。
使用ThreadGroup
创建线程是否有用?
答案 0 :(得分:23)
在具有数千个线程的大型应用程序服务器中使用ThreadGroup
可能是一种有用的诊断技术。如果您的线程在逻辑上组合在一起,那么当您获得堆栈跟踪时,您可以看到违规线程所属的组(例如“Tomcat线程”,“MDB线程”,“线程池X”等),这可以是在追踪和解决问题方面有很大的帮助。
答案 1 :(得分:13)
不要将ThreadGroup
用于新代码。请改用Executor
中的java.util.concurrent
内容。
答案 2 :(得分:10)
与所提供的答案(6年前左右)有些互补。但是,虽然Concurrency API提供了许多构造,但ThreadGroup
可能仍然有用。它提供以下功能:
interrupt()
群组中的所有主题。 (与suspend()
,resume()
和stop()
不同,中断完全没问题。ThreadGroup
设置为守护程序。 (因此添加到它的所有新线程都是守护线程)。uncaughtExceptionHandler
,这样如果组中的一个线程抛出异常,你就有一个回调来处理它。答案 3 :(得分:3)
简短的回答是 - 不,不是真的。使用它几乎没有任何好处。
要进行稍微扩展,如果要将工作线程组合在一起,那么使用ExecutorService会更好。如果要快速计算概念组中有多少线程处于活动状态,则仍需要单独检查每个线程(因为ThreadGroup.activeCount()是一个估计,这意味着如果代码的正确性取决于其输出,则它没有用)
我甚至可以说,除了语义划分之外,你今天唯一可以获得的是,作为一个群体的一部分构建的线程将获取守护进程标志和一个合理的名称基于他们的团队。并使用它作为在构造函数调用中填充一些基元的快捷方式(通常你只需要写一次,sicne你可能在循环中启动线程和/或方法调用)。
所以 - 我根本没有看到任何令人信服的理由使用它。几个月前我特意试着失败了。
编辑 - 我假设如果您正在运行SecurityManager,并且想要声明只有同一组中的线程可以互相中断,那么将会有一个潜在的用途。即使这是非常边缘的,因为对于任何非系统线程组中的线程,默认实现始终返回true。如果你正在实现自己的SecurityManager,你就有可能让它决定任何其他标准(包括在创建集合时存储线程的典型技术)。
答案 4 :(得分:1)