Java: ¿Cómo detener el hilo?

¿Hay alguna forma de detener otro hilo desde FUERA del hilo? Al igual que, si ejecuté un hilo para ejecutar ese hilo y provocó que el hilo se detenga? ¿Pararía el otro hilo?

¿Hay alguna manera de detener el hilo desde adentro sin un bucle? Por ejemplo, si está descargando idealmente, querría usar un bucle, y si uso un bucle no podré pausarlo hasta que llegue al final del bucle.

Puede crear un campo booleano y verificarlo dentro de la ejecución:

public class Task implements Runnable { private volatile boolean isRunning = true; public void run() { while (isRunning) { //do work } } public void kill() { isRunning = false; } } 

Para detenerlo simplemente llame

 task.kill(); 

Esto debería funcionar.

No detenemos ni eliminamos un hilo, sino que hacemos Thread.currentThread().isInterrupted().

 public class Task1 implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { ................ ................ ................ ................ } } } 

en main haremos así:

 Thread t1 = new Thread(new Task1()); t1.start(); t1.interrupt(); 

Una posible forma es hacer algo como esto:

 public class MyThread extends Thread { @Override public void run() { while (!this.isInterrupted()) { // } } } 

Y cuando quieras detener tu hilo, simplemente llama a un método de interrupción ():

 myThread.interrupt(); 

Por supuesto, esto no detendrá el hilo inmediatamente, sino en la siguiente iteración del ciclo anterior. En el caso de la descarga, debe escribir un código que no sea de locking . Significa que intentará leer datos nuevos del socket solo por un período de tiempo limitado. Si no hay datos disponibles, simplemente continuará. Se puede hacer usando este método desde la clase Socket:

 mySocket.setSoTimeout(50); 

En este caso, el tiempo de espera se configura en 50 ms. Después de que este tiempo se haya ido y no se leyeron datos, arroja una excepción SocketTimeoutException. De esta forma, puede escribir subprocesos iterativos y no bloqueantes, que pueden eliminarse utilizando la construcción anterior.

No es posible matar el hilo de ninguna otra manera y tú mismo debes implementar dicho comportamiento. En el pasado, Thread tenía algún método (no estoy seguro de si kill () o stop ()) para esto, pero ahora está en desuso. Mi experiencia es que algunas implementaciones de JVM ni siquiera contienen ese método actualmente.

La forma recomendada será construir esto en el hilo. Entonces, no, no puedes (o más bien no deberías) matar el hilo desde afuera.

Haga que el hilo revise con poca frecuencia si se requiere detenerlo. (En lugar de bloquear en un socket hasta que haya datos. Use un tiempo de espera y de vez en cuando verifique si el usuario indicó que desea detener)

La recomendación de JavaSun es usar una variable compartida como una bandera que le pide al hilo de fondo que se detenga. Esta variable puede ser establecida por un objeto diferente solicitando que el hilo termine.

De esa manera puedes matar el otro proceso, y el actual después.