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?
Respuesta
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.
Gracias Peter Lawrey. – Arun
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
Por eso dije 'No hay una manera segura de" matar "un hilo' Esto no le impide usarlo para fines de prueba. –
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
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.
Espere un tiempo en el hilo y elimine el hilo en el código - forma sencilla.
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. –
@StephenC throwing am exception? – Mohan
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. –
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.
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 ...
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 = nEsto 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.
- Identificar el hilo ofensivo:
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á!
también está el comando: interrupt [threadid] – revo
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.
- 1. ¿Cómo hacer pruebas de carga utilizando jmeter y visualVM?
- 2. cómo extraer bytes específicos de un archivo utilizando unix
- 3. Cómo invocar un servicio web utilizando Java
- 4. ¿Cómo matar un hilo MFC?
- 5. cómo matar (o evitar) procesos zombie con módulo de subproceso
- 6. ¿Cómo matar un subproceso en Java que está en estado EN EJECUCIÓN?
- 7. ¿Hay alguna manera de depurar un subproceso utilizando pydev?
- 8. Cómo puedo matar un proceso, utilizando VBScript, iniciado por un usuario en particular
- 9. comando UNIX 'ls' - comodín 'O' operador
- 10. ¿Cómo cargar datos iniciales (o datos iniciales) utilizando Java JPA?
- 11. Matar un proceso desaparecida en el sistema UNIX
- 12. pasar dos parámetros de comando utilizando un WPF vinculante
- 13. openssl s_client utilizando un proxy
- 14. ¿Cómo puedo generar javadocs utilizando Java?
- 15. ¿puedo matar o finalizar() una actividad en un subproceso que no sea el de UI ..?
- 16. Cómo matar subprocesos bloqueados en Java?
- 17. Contar el número de archivos en un directorio utilizando Java
- 18. ¿Cómo matar un proceso nohup?
- 19. Implementar diccionario utilizando Java
- 20. Cómo matar un proceso en Java, dado un PID específico
- 21. unix - ejecuta un comando como otro usuario
- 22. ¿Estoy utilizando Java PooledConnections correctamente?
- 23. unix comando equivalente "which java" en windows?
- 24. Python - Subproceso - ¿Cómo llamar un comando Piped en Windows?
- 25. Lista y matar a puestos de trabajo en UNIX
- 26. Comparación de fechas utilizando Java
- 27. Cómo matar un hilo en delphi?
- 28. cómo generar un círculo utilizando javascript
- 29. Eliminación de archivos utilizando el comando rm
- 30. ¿Cómo recuperar un índice de un NSArray utilizando un NSPredicate?
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.) –