¿Cómo matas a un java.lang.Thread
en Java?
java
multithreading
interrupt
flybywire
fuente
fuente
ExecutorStatus
a esta pregunta: stackoverflow.com/questions/2275443/how-to-timeout-a-threadRespuestas:
Vea este hilo de Sun sobre por qué se desaprobaron
Thread.stop()
. Entra en detalles sobre por qué este era un mal método y qué se debe hacer para detener los subprocesos de forma segura en general.La forma en que recomiendan es usar una variable compartida como un indicador que le pide al hilo de fondo que se detenga. Esta variable puede ser establecida por un objeto diferente que solicita la terminación del hilo.
fuente
getConnection()
dejava.sql.DriverManager
. Si el intento de conexión tarda demasiado, trato de eliminar el hilo correspondiente llamandoThread.interrupt()
pero no influye en el hilo en absoluto. SinThread.stop()
embargo, funciona, aunque Oracle dice que no debería funcionar siinterrupt()
no funciona. Me pregunto cómo hacerlo funcionar y evitar el uso de métodos obsoletos.Generalmente no lo haces ..
Le pide que interrumpa lo que sea que esté haciendo usando Thread.interrupt () (enlace javadoc)
Una buena explicación de por qué está en el javadoc aquí (enlace de nota técnica de Java)
fuente
interrupt()
se llama al método? La pregunta principal está relacionada con la generación de registros para cada nuevo hilo.En Java, los subprocesos no se eliminan, pero la detención de un subproceso se realiza de forma cooperativa . Se le pide al hilo que termine y el hilo puede cerrarse con gracia.
A menudo
volatile boolean
se usa un campo que el subproceso comprueba y termina periódicamente cuando se establece en el valor correspondiente.Yo no me utilizar una
boolean
para comprobar si el hilo debe terminar . Si lo usavolatile
como un modificador de campo, esto funcionará de manera confiable, pero si su código se vuelve más complejo, ya que en su lugar usa otros métodos de bloqueo dentro delwhile
ciclo, podría suceder que su código no termine en absoluto o al menos tarde más tiempo . podria querer.Cada hilo ya tiene un estado de interrupción de bandera booleana y debe usarlo. Se puede implementar así:
Código fuente adaptado de Java Concurrency in Practice . Como el
cancel()
método es público, puede dejar que otro hilo invoque este método como lo desee.fuente
Una forma es establecer una variable de clase y usarla como centinela.
Establezca una variable de clase externa, es decir, flag = true en el ejemplo anterior. Póngalo en falso para 'matar' el hilo.
fuente
volatile
para asegurarse de que funciona correctamente en todas partes. La clase interna no es estática, por lo que el indicador debería ser una variable de instancia. El indicador debe borrarse en un método de acceso para que se puedan realizar otras operaciones (como la interrupción). El nombre "bandera" no es descriptivo.Hay una manera de cómo puedes hacerlo. Pero si tuvieras que usarlo, o eres un mal programador o estás usando un código escrito por malos programadores. Por lo tanto, debe pensar en dejar de ser un mal programador o dejar de usar este código incorrecto. Esta solución es solo para situaciones en las que NO HAY OTRA MANERA.
fuente
Thread.stop
incluso si está en desuso.Thread.stop
hace lo mismo pero también verifica el acceso y los permisos. El usoThread.stop
es bastante obvio, y no recuerdo la razón por la que lo usé enThread.stop0
lugar de eso. QuizásThread.stop
no funcionó para mi caso especial (Weblogic en Java 6). O tal vez porqueThread.stop
está en desuso y causa advertencia.Quiero agregar varias observaciones, basadas en los comentarios que se han acumulado.
Thread.stop()
detendrá un hilo si el administrador de seguridad lo permite.Thread.stop()
es peligroso. Dicho esto, si está trabajando en un entorno JEE y no tiene control sobre el código que se llama, puede ser necesario; ver ¿Por qué Thread.stop está en desuso?stop()
crea un nuevoThreadDeathError
error en el hilo de llamada y luego arroja ese error en el hilo de destino . Por lo tanto, el seguimiento de la pila generalmente no tiene valor.stop()
verifica con el administrador de seguridad y luego llama astop1()
esas llamadasstop0()
.stop0()
es código nativoThread.stop()
no se ha eliminado (todavía), peroThread.stop(Throwable)
se eliminó en Java 11. ( lista de correo , JDK-8204243 )fuente
Votaría para
Thread.stop()
.Por ejemplo, tiene una operación duradera (como una solicitud de red). Supuestamente está esperando una respuesta, pero puede llevar tiempo y el usuario navegó a otra interfaz de usuario. Este hilo de espera ahora es a) inútil b) problema potencial porque cuando obtendrá el resultado, es completamente inútil y desencadenará devoluciones de llamada que pueden conducir a varios errores.
Todo eso y puede hacer un procesamiento de respuesta que podría ser intenso en la CPU. Y usted, como desarrollador, ni siquiera puede detenerlo, porque no puede lanzar
if (Thread.currentThread().isInterrupted())
líneas en todo el código.Entonces, la incapacidad de detener con fuerza un hilo es extraño.
fuente
Thread.stop()
forma segura de todos modos. No está votandoThread.stop()
, está pidiendo a cada persona que implemente cada operación que pueda tomar mucho tiempo para que sea abortable de forma segura. Y eso puede ser una buena idea, pero no tiene nada que ver con la implementaciónThread.stop()
como la forma de solicitar el aborto seguro. Ya tenemosinterrupt
para eso.stop
.La pregunta es bastante vaga. Si quisiste decir "¿cómo escribo un programa para que un hilo deje de ejecutarse cuando lo quiero?", Entonces otras respuestas deberían ser útiles. Pero si quiso decir "Tengo una emergencia con un servidor que no puedo reiniciar en este momento y solo necesito un subproceso particular para morir, pase lo que pase", entonces necesita una herramienta de intervención para que coincida con las herramientas de monitoreo como
jstack
.Para este propósito creé jkillthread . Consulte sus instrucciones de uso.
fuente
Por supuesto, existe el caso en el que está ejecutando algún tipo de código no completamente confiable. (Personalmente, tengo esto al permitir que las secuencias de comandos cargadas se ejecuten en mi entorno Java. Sí, hay una alarma de seguridad sonando en todas partes, pero es parte de la aplicación). respetar algún tipo de señal booleana de ejecución / no ejecución. Su único seguro decente es llamar al método de detención en el hilo si, por ejemplo, se ejecuta más de un tiempo de espera.
Pero, esto es simplemente "decente", y no absoluto, porque el código podría detectar el error ThreadDeath (o cualquier excepción que arrojes explícitamente), y no volver a lanzarlo como se supone que debe hacer un hilo caballeroso. Por lo tanto, la conclusión es AFAIA, no hay seguridad absoluta a prueba de fallas.
fuente
No hay forma de matar con gracia un hilo.
Puede intentar interrumpir el hilo, una estrategia común es usar una píldora venenosa para enviar un mensaje al hilo para que se detenga
}
http://anandsekar.github.io/cancel-support-for-threads/
fuente
Por lo general, no mata, detiene ni interrumpe un hilo (ni verifica si está interrumpido ()), sino que deja que termine naturalmente.
Es simple. Puede usar cualquier bucle junto con la variable booleana (volátil) dentro del método run () para controlar la actividad del hilo. También puede volver del hilo activo al hilo principal para detenerlo.
De esta manera matas con gracia un hilo :).
fuente
Los intentos de terminación abrupta de hilos son malas prácticas de programación bien conocidas y evidencia de un diseño deficiente de la aplicación. Todos los subprocesos de la aplicación multiproceso comparten de manera explícita e implícita el mismo estado del proceso y se ven obligados a cooperar entre sí para mantenerlo consistente, de lo contrario, su aplicación será propensa a los errores que serán realmente difíciles de diagnosticar. Por lo tanto, es responsabilidad del desarrollador proporcionar una garantía de dicha coherencia mediante un diseño de aplicación cuidadoso y claro.
Hay dos soluciones correctas principales para las terminaciones de subprocesos controlados:
Aquí se puede encontrar una explicación buena y detallada de los problemas relacionados con la terminación abrupta de subprocesos, así como ejemplos de soluciones incorrectas y correctas para la terminación de subprocesos controlados:
https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop%28%29+to+terminate+threads
fuente
Aquí hay un par de buenas lecturas sobre el tema:
¿Qué haces con la excepción interrumpida?
Cerrar hilos limpiamente
fuente
No conseguí que la interrupción funcionara en Android, así que utilicé este método, funciona perfectamente:
fuente
'Matar un hilo' no es la frase correcta para usar. Aquí hay una forma en que podemos implementar la finalización / salida elegante del hilo en will:
Runnable que utilicé:
La clase desencadenante:
fuente
Thread.stop está en desuso, entonces, ¿cómo detenemos un hilo en Java?
Siempre use el método de interrupción y el futuro para solicitar la cancelación
fuente