2012-05-17 13 views

Respuesta

58

La forma más simple es a interrupt(), lo que hará que Thread.currentThread().isInterrupted() para volver true, y también puede lanzar una InterruptedException bajo ciertas circunstancias en las que el hilo se espera , por ejemplo Thread.sleep(), otherThread.join(), etc. object.wait()

Dentro del método run() se necesitaría c Haga clic en esa excepción y/o compruebe regularmente el valor Thread.currentThread().isInterrupted() y haga algo (por ejemplo, salir).

Nota: Aunque Thread.interrupted() parece el mismo que isInterrupted(), tiene un efecto secundario desagradable: Llamada interrupted()borra la banderainterrupted, mientras que llamando isInterrupted() no lo hace.

Otros métodos que no interrumpen implican el uso de indicadores "stop" (volatile) que supervisa Thread.

1

Detener (matar) un hilo a mitad de camino no es recomendable. La API está actualmente en desuso.

Sin embargo, se puede obtener más detalles, incluyendo soluciones aquí: How do you kill a thread in Java?

5

Si usa ThreadPoolExecutor, y utiliza el método submit(), le dará una vuelta Future. Puede llamar al cancel() en el futuro devuelto para detener su tarea Runnable.

+0

cancelan intentos para cancelar la ejecución, pero no lo garantiza. – Rohit

6

Detener el hilo a mitad de camino no es una buena práctica. La forma más apropiada es hacer que el hilo regrese programáticamente. Deje que el objeto Runnable use una variable compartida en el método run(). Cuando quiera que el hilo se detenga, use esa variable como un indicador.

EDIT: Código de ejemplo

class MyThread implements Runnable{ 

    private Boolean stop = false; 

    public void run(){ 

     while(!stop){ 

      //some business logic 
     } 
    } 
    public Boolean getStop() { 
     return stop; 
    } 

    public void setStop(Boolean stop) { 
     this.stop = stop; 
    }  
} 

public class TestStop { 

    public static void main(String[] args){ 

     MyThread myThread = new MyThread(); 
     Thread th = new Thread(myThread); 
     th.start(); 

     //Some logic goes there to decide whether to 
     //stop the thread or not. 

     //This will compell the thread to stop 
     myThread.setStop(true); 
    } 
} 
+0

En mi clase, he escrito un método que establece flag en false. Pero no puedo acceder a este método desde la otra clase donde necesito detener el hilo. – svkvvenky

+0

¿Es esta _otra clase_ la que inicia el hilo? – Santosh

+0

sí, tiene razón .... – svkvvenky

28

Cómo detener un hilo creado por la implementación de la interfaz ejecutable?

Hay muchas maneras en que puede detener un hilo, pero todas toman un código específico para hacerlo. Una forma típica de detener un hilo es tener un campo volatile boolean shutdown que los controles de hilo de vez en cuando:

// set this to true to stop the thread 
    volatile boolean shutdown = false; 
    ... 
    public void run() { 
     while (!shutdown) { 
      // continue processing 
     } 
    } 

También pueden interrumpir el hilo que hace que sleep(), wait(), y algunos otros métodos para tirar InterruptedException. También debe probar para el indicador de interrupción de rosca con algo como:

public void run() { 
     while (!Thread.currentThread().isInterrupted()) { 
      // continue processing 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // good practice 
       Thread.currentThread().interrupt(); 
       return; 
      } 
     } 
    } 

Tenga en cuenta que que la interrupción de un hilo con interrupt() se no necesariamente hacer que una excepción inmediatamente.Solo si está en un método que es interrumpible, se lanzará el InterruptedException.

Si desea agregar un método shutdown() a su clase que implementa Runnable, debe definir su propia clase como:.

public class MyRunnable implements Runnable { 
    private volatile boolean shutdown; 
    public void run() { 
     while (!shutdown) { 
      ... 
     } 
    } 
    public void shutdown() { 
     shutdown = true; 
    } 
} 
+0

En mi clase, he escrito un método que establece el indicador (apagado en tu ejemplo) en verdadero. Pero no puedo acceder a este método desde la otra clase donde necesito detener el hilo. – svkvvenky

+0

Sí, necesitarás exponerlo de alguna manera. Normalmente hago algo así como 'clase pública. MyClass implementa Runnable {shutout boolean volátil; public void run() {if (! shutdown) {...}}} '. Puede agregar un método 'shutdown()' que establece el indicador de apagado. Entonces harías 'new Thread (new MyClass()). Start();' para ejecutarlo. – Gray

0

Thread.currentThread() isInterrupted() está magníficamente trabajo. pero este código solo pausa el temporizador.

Este código se detiene y restablece el temporizador de la secuencia. h1 es el nombre del manejador. Este código se agrega dentro de su oyente haga clic en oyente. w_h = minutos w_m = seg mili i = Contador

i=0; 
      w_h = 0; 
      w_m = 0; 


      textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m)); 
         hl.removeCallbacksAndMessages(null); 
         Thread.currentThread().isInterrupted(); 


         } 


        }); 


       }` 
Cuestiones relacionadas