Cómo matar a las discusiones estancadas en Java?
-
13-09-2019 - |
Pregunta
Me gustaría matar hilos que están atrapados en el estado de estancamiento. En primer lugar, podemos detectar ids de hilo en estado de interbloqueo utilizando el método findDeadlockedThreads()
de la clase ThreadMXBean
en java.lang.management
.
A continuación, me gustaría matar a los hilos de rosca por IDS, y por lo tanto tengo dos preguntas relacionadas:
(1) ¿Cómo obtener el control de un hilo por el ID del tema?
(2) ¿Cómo matar a un hilo bloqueado? Creo que interrumpen invokting () método dará una excepción a la rosca y matará a la rosca.
Solución
Desde el ThreadGroup raíz, se puede tener la clase de rosca enumerar todos los subprocesos que se ejecutan . A continuación, puede llamar Thread.stop en la que coincida con tu ID.
Una vez dicho esto, esto es muy peligroso debido al potencial de dejar objetos en un estado incoherente. No creo que el método de interrupción provocará un hilo para ser liberado hasta que se haya atascado en espera en un bloqueo de sincronización, por lo que el (mal) Parada de métodos
Vea también: " hilo de Java primitivo Deprecation ".
Otros consejos
El método java.util.concurrent.Lock.lockInterruptibly () es interrumpible, el bloqueo sincronizado mucho más común no lo es. Como se ha mencionado en la documentación, la capacidad de enumerar hilos estancadas pretende ser una ayuda depuración y no como un medio para recuperar en un entorno de producción.
En la producción es probable que sea más seguro para salir de todo el proceso y reiniciar.
Incluso Thread.stop () es incapaz de dejar de hilo en un punto muerto en el bloqueo intrínseco. Si un hilo está bloqueado a la espera de un bloqueo intrínseco, no hay nada que pueda hacer para detenerlo corta de asegurar que con el tiempo adquiere el bloqueo y hace suficientes progresos que se puede obtener su atención de alguna otra manera. funciona con el bloqueo .lock () a través de.