2012-07-23 18 views
17

Estoy usando Windows 7 OS. Tengo alrededor de 6 hilos en mi aplicación. Con el propósito de probar las alertas para verificar el estado de los hilos, necesito matar los hilos manualmente y verificar si las alertas funcionan correctamente. ¿Podemos matar un hilo como la forma en que matamos un proceso con su pid?Cómo matar un subproceso Java utilizando VisualVM o utilizando un comando Unix?

+2

Los subprocesos son un detalle de implementación interna de la aplicación. No son visibles ni accesibles desde fuera de la aplicación. Si un hilo muere inesperadamente, la aplicación no se puede utilizar, ya que no hay aislamiento entre los hilos. (Piense en lo que sucede si el hilo mantiene un bloqueo. Si lo suelta, boom. Si no lo suelta, boom.) –

Respuesta

11

No hay forma segura de "matar" un hilo sin matar el proceso en el que se encuentra. No es algo que haría deliberadamente. Para fines de prueba, agregaría código a su aplicación para respaldar esto.

+0

Gracias Peter Lawrey. – Arun

+0

Pero el uso de Thread.stop está en desuso. Encontré que esto es útil. http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html – Arun

+1

Por eso dije 'No hay una manera segura de" matar "un hilo' Esto no le impide usarlo para fines de prueba. –

2

No puede hacerlo desde fuera (SO o depurador), tendrá que escribir su propio perro guardián de subprocesos que puede interactuar con el usuario y matar el hilo que desee.

tratar de buscar here de cómo manejar señales con Java

0

en Java no se puede matar por el estilo Unix. O bien puede interrupt la banda de rodadura en java o puede matar el proceso en Unix.

0

Espere un tiempo en el hilo y elimine el hilo en el código - forma sencilla.

+0

No creo que entiendas la pregunta, y de todos modos, como dice Peter Lawrey, no hay una forma segura de matar un hilo de Java. –

+0

@StephenC throwing am exception? – Mohan

+0

No se puede hacer que un hilo no cooperativo arroje una excepción. No se trata de decir un hilo para "suicidarse". Se trata de matar un hilo que no está escuchando ... y hacerlo de una manera que * simule * la falla de una aplicación en la producción. –

4

Como dice Peter, no puedes hacer esto de forma segura. De hecho, en algunas plataformas Thread.kill ni siquiera está implementado. Sin embargo:

  • Si esto es simplemente para la prueba, una prueba de unidad que llama Thread.kill sería razonable ... suponiendo que trabajaba en las plataformas de ensayo en los que necesitaba para trabajar. (Un comentario "ruidoso" en el código fuente sería para ayudar a las personas a portar la prueba unitaria ...)

  • Otra alternativa es agregar algún código al hilo ejecutable que permita que las pruebas de su unidad lo indiquen morir. Si el código del subproceso necesita ser (casi) el código de producción para que funcione, puede crear una subclase que anule algo para que se "rompa" de una manera que se adapte a sus propósitos ... para la prueba. De hecho, este enfoque le permite hacer que los subprocesos "se rompan" de manera controlada, lo que potencialmente le permite probar diferentes aspectos de su código de alerta.

31

Dan Woods documentado cómo matar un hilo en esta entrada de blog ... https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread Los pasos que realiza implicó el uso de un depurador (JDB) y la inyección de una excepción en la ejecución del hilo. Específicamente ...

  1. Asegúrese de que el programa Java se inicia con los siguientes parámetros:

    -Dcom.sun.management.jmxremote.port = 50199
    -Dcom.sun.management. jmxremote.authenticate = false
    -Dcom.sun.management.jmxremote.ssl = false
    -Xrunjdwp: transport = dt_socket, dirección = 50100, servidor = y, suspender = n

    Esto nos permitirá adjuntar el depurador de Java al proceso en ejecución, después de identificamos qué subproceso está causando el problema.Además, asegúrese de que tenga su configuración de iptables de forma adecuada para permitir solo las conexiones en 50100 y 50199 desde los hosts/estaciones de trabajo que administra.

  2. Identificar el hilo ofensivo:
  3. Mate el hilo. En este ejemplo, ThreadName es "btpool0-0". Pon en marcha el depurador de Java (también se incluye con la distribución JDK), y adjuntar a la JVM corriendo ...

    [root @ host ~] # jdb -attach 50100

Obtener una lista de los subprocesos que se ejecutan - esto también nos dará el ID del tema como la JVM lo ve:

> threads 
--snip-- 
(org.mortbay.thread.BoundedThreadPool$PoolThread)0x25cb 
btpool0-0 running 
--snip-- 

el ID del tema que vamos a matar es “0x25cb”. El primer paso de matar el hilo es para saltar en él, y suspenderlo ...

thread 0x25cb 
btpool0-0[1] suspend 0x25cb 
btpool0-0[1] step 
Step completed: <... snip ...> 
btpool0-0[1] kill 0x25cb new java.lang.Exception() 
killing thread: btpool0-0 
btpool0-0[1] instance of 
com.site.package.name(name='btpool0-0', id=9675) killed btpool0-0[1] 

salida del depurador de Java, y ya está!

+2

también está el comando: interrupt [threadid] – revo

2

No es cierto. Siempre puede adjuntar al proceso de JVM con GDB y hacer una llamada pthread_kill si conoce el id. De subproceso. Solo necesita traducir desde el volcado del hilo de java (hacer un kill -3) que le da un id. Hexadecimal (id. Nativo), luego buscar en la lista de hilos en GDB (hilos de información) y localizar el id del hilo real.

Esto ha demostrado que funciona.

Cuestiones relacionadas