2010-11-24 20 views
18

Cómo detener o interrumpir un hilo que duerme en java.? Tengo un hilo que sincroniza datos y duerme durante 10 minutos en el método run(), si quiero detener la sincronización deteniendo el hilo cuando está durmiendo. ¿Cómo se puede lograr esto?Interrumpir o detener un hilo que duerme

+2

El duplicado exacto ya no existe :-( –

+1

¿Debería volver a abrirse esta pregunta ya que su duplicado fue eliminado por el autor? – Craigy

Respuesta

19

Llame al método de interrupción() en su hilo. Esto hará que se suspenda el sueño y se lanzará una InterruptedException.

+2

¿Qué pasa si el hilo no está durmiendo, y todavía quiero hacer algo como Thread.sleep? – Jaydev

11

Puede interrumpir un hilo que duerme con Thread.interrupt(). Ahora detener un hilo está en desuso, ¿y si el hilo mantiene un bloqueo en algo? (Hubo un Thread.stop(), pero está MUY desaconsejado).

De forma alternativa, en lugar de dormir, puede hacer que el hilo espere a que se notifique un objeto con tiempo de espera, y simplifique la notificación al objeto si desea que el hilo se active.

2

Frederik tiene razón: llame a Thread.interrupt(); Solo quería advertirle que no use stop() ya que está en desuso desde Java 1.1. Y otra advertencia. Creo que si está usando sleep() y desea interrumpir el hilo, es un buen momento para pensar en mover a wait() y notify(). Hay muchos tutoriales sobre hilos de java y el javadoc de java.lang.Thread es lo suficientemente bueno, por lo que puede seguir leyendo allí si no está familiarizado con estas API.

6

Suresh, deseo prestar atención a un problema. Los métodos de interrupción() en sí no interrumpen el hilo. Simplemente envía una solicitud a un hilo por interrupción, estableciendo el indicador en verdadero. Por lo general, su hilo debe procesar la política de cancelación/interrupción. Se describe en gran medida en Java Concurrecy in Practice, sección 7.1 Cancelación de tareas.

Bloqueando métodos de biblioteca como Thread.sleep y Object.wait intentan detectar cuando un hilo ha sido interrumpido y regresan temprano. Responden a la interrupción borrando el estado interrumpido y lanzando InterruptedException.

1

Como no puedo hacer ningún comentario, publicaré otra respuesta. Solo quiero reforzar y aclarar lo que dijo Alexandr. interrupt() solo establece un indicador en el Thread, y el objeto Thread o Runnable extendido tiene que comprobar si se ha interrumpido con Thread.interrupted() para hacer lo que se supone que debe hacer cuando se interrumpe.

interrupt() también detiene un wait() o sleep(), pero tenga en cuenta que esos métodos DESEE el indicador de interrupción. Por lo tanto, si llama al interrupt() en un hilo de espera/espera, dejará de dormir/esperando pero no sabrá que fue interrumpido, excepto si detecta la excepción, y no continuará siendo interrumpido.

Pude arreglar un programa mío mediante la implementación de mi propio indicador de interrupción, que no pudo ser anulado por los métodos sleep() y wait(). Además, sepa que puede interrumpir un hilo desde dentro con Thread.currentThread().interrupt().

Cuestiones relacionadas