ThreadGroup在创建单独的线程方面有什么好处?

时间:2009-10-30 10:52:03

标签: java multithreading

不推荐使用stop()resume()suspend()等许多方法。

使用ThreadGroup创建线程是否有用?

5 个答案:

答案 0 :(得分:23)

在具有数千个线程的大型应用程序服务器中使用ThreadGroup可能是一种有用的诊断技术。如果您的线程在逻辑上组合在一起,那么当您获得堆栈跟踪时,您可以看到违规线程所属的组(例如“Tomcat线程”,“MDB线程”,“线程池X”等),这可以是在追踪和解决问题方面有很大的帮助。

答案 1 :(得分:13)

不要将ThreadGroup用于新代码。请改用Executor中的java.util.concurrent内容。

答案 2 :(得分:10)

与所提供的答案(6年前左右)有些互补。但是,虽然Concurrency API提供了许多构造,但ThreadGroup可能仍然有用。它提供以下功能:

  1. 线程的逻辑组织(用于诊断目的)。
  2. 您可以interrupt()群组中的所有主题。 (与suspend()resume()stop()不同,中断完全没问题。
  3. 您可以设置组中线程的最大优先级。 (不确定它有多广泛,但你有它)。
  4. ThreadGroup设置为守护程序。 (因此添加到它的所有新线程都是守护线程)。
  5. 它允许你覆盖它的uncaughtExceptionHandler,这样如果组中的一个线程抛出异常,你就有一个回调来处理它。
  6. 它为您提供了一些额外的工具,例如获取线程列表,您拥有多少活动线程等。当有一组工作线程或某种某种线程池时很有用。

答案 3 :(得分:3)

简短的回答是 - 不,不是真的。使用它几乎没有任何好处。

要进行稍微扩展,如果要将工作线程组合在一起,那么使用ExecutorService会更好。如果要快速计算概念组中有多少线程处于活动状态,则仍需要单独检查每个线程(因为ThreadGroup.activeCount()是一个估计,这意味着如果代码的正确性取决于其输出,则它没有用)

我甚至可以说,除了语义划分之外,你今天唯一可以获得的是,作为一个群体的一部分构建的线程将获取守护进程标志和一个合理的名称基于他们的团队。并使用它作为在构造函数调用中填充一些基元的快捷方式(通常你只需要一次,sicne你可能在循环中启动线程和/或方法调用)。

所以 - 我根本没有看到任何令人信服的理由使用它。几个月前我特意试着失败了。

编辑 - 我假设如果您正在运行SecurityManager,并且想要声明只有同一组中的线程可以互相中断,那么将会有一个潜在的用途。即使这是非常边缘的,因为对于任何非系统线程组中的线程,默认实现始终返回true。如果你正在实现自己的SecurityManager,你就有可能让它决定任何其他标准(包括在创建集合时存储线程的典型技术)。

答案 4 :(得分:1)

@skaffman很棒answer。我想再增加一个优势:

线程组有助于同时操作此中定义的所有线程。

例如:您可以使用单个方法调用启动或中断组内的所有线程。