2011-11-18 15 views
8

¿Es posible matar un hilo que está en el estado RUNNING de una manera no programática?¿Cómo matar un subproceso en Java que está en estado EN EJECUCIÓN?

Sé que el comando top en *nix puede mostrar los hilos. ¿Puedo matar el hilo en el sistema operativo?

Me gustaría saber si hay una manera de vincular un hilo a un proceso para que pueda matar solo ese hilo específico y no la aplicación.

Tuvimos un error en nuestro código que mantenía un subproceso en el estado RUNNING en un método sincronizado. El hilo mantuvo el lock en el objeto "colgando" la aplicación.

El error ha sido reparado. Pero me pregunto si es posible.

+2

¡Si tiene un pid puede matarlo! – hovanessyan

+0

buscando solución solo en * nix o no? –

+0

ProcessExplorer en Windows puede matar subprocesos individuales, por lo que sí, es posible. probablemente en Unix también. –

Respuesta

9

La respuesta breve es "tal vez, pero no debería y la mayoría de las veces tampoco funcionará".

La respuesta larga es:

"Tal vez ..." Algunos hilos de ejecución de Java JVM mapa a hebras de SO y otros no. Si la JVM realiza una asignación a una secuencia de sistema operativo nativa, es posible que pueda eliminarla con alguna herramienta de proceso que proporcione el sistema operativo (como kill en * nix). Si la JVM tiene hilos verdes, lo que significa que no asigna un hilo de Java a un hilo de nivel de sistema operativo, entonces básicamente no tiene suerte con las herramientas de nivel de sistema operativo. Afortunadamente, solo muy pocas implementaciones de JVM hacen esto. Un enfoque que puede usarse sin importar de qué manera la JVM organiza sus hilos, está usando el depurador de Java. Este artículo describe el procedimiento para hacerlo: http://www.rhcedan.com/2010/06/22/killing-a-java-thread/.

"pero no debe hacerlo" Matar a un hilo en el nivel de sistema operativo es casi seguro que dejar la JVM en un estado indefinido (léase "JVM se puede bloquear o borrar todos los archivos del disco o hacer lo que sea fricking agrada hacer "). Incluso cuando se usa la depuradora, solo una cantidad muy pequeña de aplicaciones Java (léase "ninguna aplicación hecha en este planeta") manejará adecuadamente el evento de que una aplicación externa mate uno de sus hilos. Como resultado, estas aplicaciones se pondrán en un estado indefinido (léase "la aplicación puede bloquear o eliminar todos los archivos en su disco o hacer lo que sea que haga papilla").

"y la mayoría de las veces no va a funcionar bien" Si el hilo es muy pegado con un poco bloqueado IO, etc., entonces matar el hilo no va a funcionar, se acaba de no responder. Si un programa está bloqueado, probablemente sea mejor eliminar todo el programa, encontrar el problema con el programa y solucionarlo en lugar de matar un solo hilo.

+0

Sé que no es el camino. Solo me estoy preguntando. Gracias por tu respuesta. – ssedano

0

Thread.interrupt método para solicitar a la parada de un hilo ..
O si u está utilizando un grupo de subprocesos entonces executorService.shutdown() and executorService.shutdownNow() should be used to shutdown the thread

+1

El OP solicitó un enfoque no programático. –

Cuestiones relacionadas