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

Creé la clase implementando la interfaz ejecutable y luego creé muchos hilos (casi 10) en alguna otra clase de mi proyecto.
¿Cómo detener algunos de esos hilos?

La forma más simple es interrupt() , lo que hará que Thread.currentThread().isInterrupted() devuelva true , y también puede lanzar una InterruptedException en ciertas circunstancias donde el subproceso está esperando , por ejemplo Thread.sleep() , otherThread.join() , object.wait() etc.

Dentro del método run() necesitaría capturar esa excepción y / o verificar regularmente el valor Thread.currentThread().isInterrupted() y hacer algo (por ejemplo, romper).

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

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

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

Hay muchas formas 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 de volatile boolean shutdown que el hilo revisa cada cierto tiempo:

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

También puede interrumpir el hilo que causa sleep() , wait() y algunos otros métodos para lanzar InterruptedException . También debe probar el indicador de interrupción de hilo 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 la interrupción de un hilo con interrupt() no necesariamente hará que arroje una excepción de inmediato. Solo si se encuentra en un método que es interrumpible, se lanzará la 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; } } 

Detener el hilo a medio 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.

EDITAR: código de muestra

 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); } } 

Si usa ThreadPoolExecutor y usa el método submit () , le devolverá el Future . Puede llamar a cancel () en el futuro devuelto para detener su tarea Runnable .

No se recomienda detener (matar) un hilo a mitad de camino. La API está actualmente en desuso.

Sin embargo, puede obtener más detalles que incluyen soluciones: ¿Cómo mata un hilo en Java?

Thread.currentThread (). IsInterrupted () funciona estupendamente. 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 botón clic oyente. w_h = minutos w_m = mili seg 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(); } }); }`