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

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

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

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

不要将ThreadGroup用于新代码。 请改用java.util.concurrentExecutor

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

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

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

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

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

所以 – 我真的没有看到任何令人信服的理由使用一个。 几个月前我特意尝试过,但都失败了。

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

@skaffman很棒的答案 。 我想再增加一个优势:

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

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