2009-10-30 13 views

Respuesta

19

El uso de ThreadGroup puede ser una técnica de diagnóstico útil en los servidores de aplicaciones grandes con miles de subprocesos. Si tus hilos están lógicamente agrupados, cuando obtienes un seguimiento de pila puedes ver de qué grupo forma parte el hilo ofensivo (por ejemplo, "hilos de Tomcat", "hilos de MDB", "grupo de hilos X", etc.), que puede ser una gran ayuda para rastrear y solucionar el problema.

+2

Lo he considerado en el pasado, y no creo que le dé más que solo nombrar los hilos apropiadamente. Sin embargo, si no puede modificar los nombres de la secuencia, o si tiene una herramienta que monitorea la actividad de la secuencia agregada por grupo, esa es una cuestión diferente. –

+3

Punto justo, pero la estructura adicional puede ser útil, por ejemplo, agregando el uso de la CPU por grupo de hilos. – skaffman

+1

Los uso en una aplicación empresarial muy grande por este motivo en particular. Podría haberme hecho un seguimiento de ellos, pero me hubiera obligado a escribir un montón de código para administrar los contenidos de mi colección cuando termine el hilo, muera, etc. – Fredrik

3

La respuesta corta es - no, en realidad no. Hay poco o ningún beneficio de usar uno.

Para ampliarlo ligeramente, si desea agrupar los hilos de los trabajadores, es mucho mejor utilizar un ExecutorService. Si desea contar rápidamente cuántos subprocesos en un grupo conceptual están vivos, aún necesita verificar cada subproceso individualmente (como ThreadGroup.activeCount() es una estimación, lo que significa que no es útil si la corrección de su código depende de su resultado) .

Me atrevería a decir que lo único que obtendría de uno estos días, aparte de la compartimentación semántica, es que los hilos construidos como parte de un grupo recogerán la bandera daemon y una sensible nombre basado en su grupo. Y usar esto como un atajo para completar algunas primitivas en una llamada de constructor (que normalmente solo tendrías que escribir una vez, sicne probablemente estés iniciando los hilos en un bucle y/o llamada a un método).

Entonces, realmente no veo ningún motivo convincente para usar uno. Lo intenté específicamente, hace unos meses, y fallé.

EDITAR - I suponga un uso potencial sería si está ejecutando con un SecurityManager, y quiere afirmar que solo los hilos en el mismo grupo pueden interrumpirse entre sí. Incluso eso es bastante dudoso, ya que la implementación predeterminada siempre devuelve verdadero para un subproceso en cualquier grupo de subprocesos que no sean del sistema. Y si está implementando su propio SecurityManager, tiene la posibilidad de que tome una decisión sobre cualquier otro criterio (incluida la técnica típica de almacenar Threads en colecciones a medida que se crean).

+0

Cómo se almacena un 'Thread' en una colección a medida que se crea. No veo cómo puedes saber cuándo se crea un hilo. –

+0

El bit donde vas 'new Thread (...)'. :-) Como un Thread solo se puede asignar explícitamente a un grupo en el momento de la construcción, es razonable suponer que el código del OP los está creando explícitamente. Si él no está llamando al constructor él mismo no puede cambiar el grupo de hilos de todos modos. –

14

No utilice ThreadGroup para obtener un código nuevo. Utilice el Executor cosas en java.util.concurrent en su lugar.

+3

¿Por qué? ¿Hay alguna buena razón para esto? – ShiDoiSi

+3

Effective Java 2nd Ed. Punto 73. Lamentablemente, creo que la comunidad global no ha votado sobre la información en esta pregunta tal como está actualmente. –

+3

Esto no parece responder a la pregunta, que es "¿Por qué debería usarlo?" no "¿Debo usarlo?" – immibis

8

Algo complementario a la respuesta brindada (hace 6 años más o menos). Pero, si bien la API de concurrencia proporciona muchas construcciones, el ThreadGroup podría ser útil. Proporciona la siguiente funcionalidad:

  1. Organización lógica de sus hilos (con fines de diagnóstico).
  2. Puede interrupt() todos los hilos en el grupo. (La interrupción está perfectamente bien, a diferencia de suspend(), resume() y stop()).
  3. Puede establecer la prioridad máxima de los hilos en el grupo. (no estoy seguro de cuán útil es eso, pero ahí lo tiene).
  4. Establece ThreadGroup como daemon. (Entonces, todos los hilos nuevos añadidos serán hilos daemon).
  5. Le permite anular su uncaughtExceptionHandler de modo que si uno de los hilos en el grupo arroja una excepción, tiene una devolución de llamada para manejarlo.
  6. Le proporciona algunas herramientas adicionales como obtener la lista de hilos, cuántos activos tiene, etc. Útil cuando tiene un grupo de hilos de trabajo, o algún grupo de hilos de algún tipo.
1

Excelente answer para @skaffman. Quiero agregar una ventaja más:

Los grupos de subprocesos ayudan a manipular todos los subprocesos que se definen en esto a la vez.

Por ejemplo: puede iniciar o interrumpir todos los hilos dentro de un grupo con una sola llamada a un método.

+0

Suspender es una opción obsoleta, ya que también se puede leer en @jbx respuesta – jontro

Cuestiones relacionadas