Digamos que tengo una aplicación que utiliza el Executor
framework como tal
Executors.newSingleThreadExecutor().submit(new Runnable(){
@Override
public void run(){
// do stuff
}
}
Cuando ejecuto esta aplicación en el depurador, un hilo se crea con el siguiente nombre (por defecto): Thread[pool-1-thread-1]
. Como puede ver, esto no es terriblemente útil y, por lo que puedo decir, el Executor
marco no proporciona una manera fácil de nombrar los hilos o grupos de hilos creados.
Entonces, ¿cómo se hace para proporcionar nombres para los hilos / grupos de hilos? Por ejemplo, Thread[FooPool-FooThread]
.
Puede intentar proporcionar su propia fábrica de hilos, que creará hilos con los nombres apropiados. Aquí hay un ejemplo:
fuente
También puede cambiar el nombre de su hilo después, mientras se ejecuta el hilo:
Eso podría ser interesante si, por ejemplo, está utilizando el mismo ThreadFactory para diferentes tipos de tareas.
fuente
(Note however that if this single thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks.)
. Si el ExecutorService reemplaza el hilo, ThreadFactory lo nombrará. Por otra parte, ver desaparecer el nombre durante la depuración podría ser un indicador útil.El
BasicThreadFactory
de Apache Commons-lang también es útil para proporcionar el comportamiento de nombres. En lugar de escribir una clase interna anónima, puede usar el generador para nombrar los hilos como desee. Aquí está el ejemplo de los javadocs:fuente
Si está utilizando Spring, hay
CustomizableThreadFactory
una opción para establecer un prefijo de nombre de hilo.Ejemplo:
Alternativamente, puede crear su
ExecutorService
como un Spring bean usandoThreadPoolExecutorFactoryBean
, luego los hilos se nombrarán con elbeanName-
prefijo.En el ejemplo anterior, los hilos se nombrarán con
myExecutor-
prefijo. Puede establecer el prefijo explícitamente en un valor diferente (p. Ej."myPool-"
) ConfigurandoexecutorFactoryBean.setThreadNamePrefix("myPool-")
el bean de fábrica.fuente
Hay un RFE abierto para esto con Oracle. Según los comentarios del empleado de Oracle, parece que no entienden el problema y no lo solucionarán. Es una de estas cosas que es muy fácil de admitir en el JDK (sin romper la compatibilidad con versiones anteriores), por lo que es una pena que el RFE se malinterprete.
Como se señaló, debe implementar su propia ThreadFactory . Si no desea obtener Guava o Apache Commons solo para este propósito, le proporciono aquí una
ThreadFactory
implementación que puede usar. Es exactamente similar a lo que obtienes del JDK, excepto por la capacidad de establecer el prefijo del nombre del hilo en algo más que "pool".Cuando quiera usarlo, simplemente aproveche el hecho de que todos los
Executors
métodos le permiten proporcionar el suyo propioThreadFactory
.Esta
dará un ExecutorService donde se nombran hilos
pool-N-thread-M
pero usandoobtendrá un ExecutorService donde se nombran los hilos
primecalc-N-thread-M
. Voila!fuente
ThreadGroup
a favorThreadPoolExecutor
.Pase ThreadFactory a un servicio de ejecutor y estará listo para comenzar.
fuente
Una forma rápida y sucia es usar
Thread.currentThread().setName(myName);
elrun()
método.fuente
Extender ThreadFactory
public interface ThreadFactory
Thread newThread(Runnable r)
Código de muestra:
salida:
.... etc.
fuente
Como ya se dijo en otras respuestas, puede crear y usar su propia implementación de la
java.util.concurrent.ThreadFactory
interfaz (no se requieren bibliotecas externas). Estoy pegando mi código a continuación porque es diferente a las respuestas anteriores, ya que usa elString.format
método y toma un nombre base para los hilos como argumento de constructor:Y este es un ejemplo de uso:
EDITAR : hacer que mi
ThreadFactory
implementación sea segura para subprocesos , gracias a @mchernyakov por señalarlo.Aunque en ninguna parte de la
ThreadFactory
documentación se dice que sus implementaciones deben ser seguras para subprocesos, el hecho de queDefaultThreadFactory
es seguro para subprocesos es una gran pista:fuente
La solución central de Java que utilizo para decorar fábricas existentes:
En acción:
fuente
fuente
Puede escribir su propia implementación de ThreadFactory, utilizando, por ejemplo, alguna implementación existente (como defaultThreadFactory) y cambiar el nombre al final.
Ejemplo de implementación de ThreadFactory:
Y uso:
fuente
Solía hacer lo mismo que a continuación (requiere
guava
biblioteca):fuente
ThreadFactoryBuilder
es de la biblioteca Google Guava.Me resulta más fácil usar una lambda como fábrica de hilos si solo desea cambiar el nombre de un solo ejecutor de hilos.
fuente
main@1, Finalizer@667, Reference Handler@668, Your name@665, Signal Dispatcher@666
Esta es mi fábrica personalizada que proporciona nombres personalizados para analizadores de volcado de subprocesos. Por lo general, solo doy
tf=null
para reutilizar la fábrica de hilos predeterminada de JVM. Este sitio web tiene una fábrica de hilos más avanzada.Para su comodidad, este es un bucle de volcado de subprocesos para fines de depuración.
fuente