Muchos métodos como stop()
, resume()
, suspend()
etc. están en desuso.¿Cuál es el beneficio de ThreadGroup en Java sobre la creación de subprocesos independientes?
¿Es útil crear hilos usando ThreadGroup
?
Muchos métodos como stop()
, resume()
, suspend()
etc. están en desuso.¿Cuál es el beneficio de ThreadGroup en Java sobre la creación de subprocesos independientes?
¿Es útil crear hilos usando ThreadGroup
?
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.
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).
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. –
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. –
No utilice ThreadGroup
para obtener un código nuevo. Utilice el Executor
cosas en java.util.concurrent
en su lugar.
¿Por qué? ¿Hay alguna buena razón para esto? – ShiDoiSi
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. –
Esto no parece responder a la pregunta, que es "¿Por qué debería usarlo?" no "¿Debo usarlo?" – immibis
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:
interrupt()
todos los hilos en el grupo. (La interrupción está perfectamente bien, a diferencia de suspend()
, resume()
y stop()
).ThreadGroup
como daemon. (Entonces, todos los hilos nuevos añadidos serán hilos daemon).uncaughtExceptionHandler
de modo que si uno de los hilos en el grupo arroja una excepción, tiene una devolución de llamada para manejarlo.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.
Suspender es una opción obsoleta, ya que también se puede leer en @jbx respuesta – jontro
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. –
Punto justo, pero la estructura adicional puede ser útil, por ejemplo, agregando el uso de la CPU por grupo de hilos. – skaffman
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