He creado una clase implementando la interfaz ejecutable y luego he creado muchos hilos (casi 10) en alguna otra clase de mi proyecto.
¿Cómo detener algunos de esos hilos?Cómo detener un hilo creado mediante la implementación de la interfaz ejecutable?
Respuesta
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.
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?
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);
}
}
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;
}
}
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
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
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();
}
});
}`
- 1. IntelliJ - detener un hilo durante la depuración
- 2. Detener un hilo
- 3. ¿Handler.post (ejecutable) inicia un nuevo hilo?
- 4. Implementación de la interfaz IList
- 5. Detener un hilo en Java?
- 6. Comenta la interfaz, la implementación o ambas?
- 7. Pasar un valor de la actividad al hilo después de que el hilo ya está creado
- 8. Qt: Hilo de actualización de la interfaz UI hilo
- 9. ¿Cómo obtener la id de winapi de un hilo creado con la biblioteca estándar?
- 10. ¿Cómo acceder al hilo en ejecución/ejecutable?
- 11. ¿Cómo puede un hilo de fondo colgar el hilo de la interfaz de usuario?
- 12. Acceso a la interfaz de usuario en un hilo
- 13. cómo detener un NSThread sub-hilo en iphone
- 14. Implementación implícita y explícita de la interfaz
- 15. Implementación de la interfaz Java en MATLAB
- 16. "Restricciones para la implementación de interfaz explícita ..."
- 17. Interrumpir o detener un hilo que duerme
- 18. Uso de crear un hilo mediante la extensión de una clase Thread
- 19. Cómo detener un error de 500 .net creado llamando a la página de error 500
- 20. MVVM SimpleIoc, cómo utilizar una interfaz cuando la implementación de la interfaz requiere parámetros de construcción
- 21. ¿Cómo conecto automáticamente un hilo creado por Spring TaskExecutor?
- 22. Interfaz que implica la implementación del indexador
- 23. Ingrese a la implementación de la interfaz en Eclipse IDE
- 24. Detener un hilo después de un cierto período de tiempo
- 25. Problema con la implementación de la interfaz en clases parciales
- 26. ¿Cómo detener un hilo de Java con gracia?
- 27. Ruby, la implementación de un exe con ocra que contiene la interfaz gráfica de usuario TK
- 28. Detener el hilo en python3
- 29. Cómo detener el hilo asynctask en android?
- 30. La implementación de la misma interfaz en diferentes instancias genéricas
cancelan intentos para cancelar la ejecución, pero no lo garantiza. – Rohit