pro para oxygen kepler installing instalar descargar java multithreading eclipse stack-trace

java - para - Detectar quién creó un hilo(w. Eclipse)



windowbuilder eclipse oxygen (4)

Al depurar su aplicación Eclipse, puede detener todo el hilo haciendo clic en el campo org.eclipse.equinox.launcher.Main en la vista de depuración.

Luego, a partir de ahí, para cada subproceso puede ver el seguimiento de la pila y sube al método de ejecución thred.

A veces esto puede ayudar y otras veces no.

Como dijo Brian, es una buena práctica nombrar hilos porque es la única forma de identificar fácilmente "quién los creó"

¿Cómo puedo saber quién creó un Thread en Java?

Imagine lo siguiente: Utiliza ~ 30 JAR de terceros en un entorno complejo de complementos. Lo inicia, ejecuta un montón de código, hace algunos cálculos y finalmente llama a shutdown ().

Este ciclo de vida generalmente funciona bien, excepto que en cada ejecución algunos hilos (no demoníacos) permanecen colgando. Esto no sería un problema si cada cierre fuera el último, simplemente podría ejecutar System.exit () en ese caso. Sin embargo, este ciclo puede ejecutarse varias veces y está produciendo más basura en cada pasada.

¿Entonces qué debo hacer? Veo los hilos en la vista de depuración de Eclipse. Veo sus huellas de pila, pero no contienen ningún indicio sobre su origen. Sin rastro de pila del creador, sin nombre de clase distinguible, nada.

¿Alguien tiene una idea de cómo abordar este problema?


De acuerdo, pude resolver (más o menos) el problema por mi cuenta: puse un punto de interrupción en

Thread.start()

y paso manualmente a través de cada invocación. De esta manera descubrí rápidamente que Class.forName () inicializó un lote de código estático que a su vez creó estos misteriosos hilos.

Si bien pude resolver mi problema, sigo pensando que la tarea más general sigue sin resolverse.


Lamentablemente no es así. Dentro de Eclipse veo todos los subprocesos de bloqueo, pero sus trazas de pila solo reflejan su estado interno y (aparentemente) no revelan información sobre la ubicación de su creación. Además, al mirar dentro del objeto (usando la vista Variables) no pude obtener más sugerencias.


Nombro religiosamente mis hilos (usando Thread (Runnable, String) , digamos), de lo contrario terminan con un nombre genérico y algo inútil. Al volcar los hilos se resaltará lo que se está ejecutando y (por lo tanto) lo que se creó. Esto no resuelve la creación de hilos de terceros, lo aprecio.

EDITAR: El boletín de JavaSpecialist abordó este problema recientemente (febrero de 2015) mediante el uso de un administrador de seguridad. Vea aquí para más detalles

MÁS: Un par de detalles para usar la técnica JavaSpecialist: La API de SecurityManager incluye "checkAccess (newThreadBeingCreated)" que se llama en el hilo del creador del hilo. El nuevo hilo ya tiene su "nombre" inicializado. Entonces, en ese método, tiene acceso tanto al hilo del creador del hilo como al nuevo, y puede registrar / imprimir, etc. Cuando intenté esto, el código que estaba siendo monitoreado comenzó a lanzar excepciones de protección de acceso; Lo arreglé llamándolo bajo AccessController.doPriviledged (new PrivilegedAction () {...} donde el método run () llamó al código que se está monitoreando.