reiniciar - hilos en java pdf
¿Cómo se debería cerrar un hilo en Java? (5)
Esta es una pregunta corta. En algún punto, mi hilo entiende que debería ser suicidio. Cuál es la mejor manera de hacerlo:
- Thread.currentThread (). Interrupt ();
- regreso;
Por cierto, ¿por qué en el primer caso necesitamos usar currentThread
? ¿El Thread
no se refiere al hilo actual?
El hilo es una clase, no una instancia; currentThread () es un método estático que devuelve la instancia de subproceso correspondiente a la cadena de llamada.
Use (2). interrupt () es un poco brutal para el uso normal.
Si el método de ejecución finaliza, el hilo terminará.
Si usa un bucle, una forma correcta es como seguir:
// In your imlemented Runnable class:
private volatile boolean running = true;
public void run()
{
while (running)
{
...
}
}
public void stopRunning()
{
running = false;
}
Por supuesto, regresar es la mejor manera.
Si estás en el nivel superior, o puedes llegar limpiamente al nivel superior, del hilo, simplemente regresar es bueno. Lanzar una excepción no es tan limpio, ya que necesita poder verificar que nada atrape la excepción e ignorarla.
La razón por la que necesita usar Thread.currentThread()
para llamar a interrupt()
es que interrupt()
es un método de instancia - necesita llamarlo en el hilo que desea interrumpir, que en su caso es el actual hilo. Tenga en cuenta que la interrupción solo se notará la próxima vez que el hilo se bloquee (por ejemplo, para IO o para un monitor) de todos modos, no significa que la excepción se produce inmediatamente.
Si quieres terminar el hilo , simplemente regresar está bien. NO es necesario que llame a Thread.currentThread().interrupt()
(aunque no hará nada malo. Es solo que no es necesario). Esto se debe a que interrupt()
se usa básicamente para notificar al propietario del hilo (bueno, no es 100% exacto, pero más o menos). Como usted es el propietario del hilo y decidió terminar el hilo, no hay nadie a quien notificar, por lo que no necesita llamarlo.
Por cierto, ¿por qué en el primer caso necesitamos usar currentThread? ¿El hilo no se refiere al hilo actual?
Sí, no es así Supongo que puede ser confuso porque, por ejemplo, Thread.sleep () afecta al hilo actual, pero Thread.sleep () es un método estático.
Si usted NO es el propietario del hilo (por ejemplo, si no ha ampliado el Thread
y ha codificado un Runnable
etc.) debería hacerlo
Thread.currentThread().interrupt();
return;
De esta forma, cualquiera que sea el código que llame a su ejecutable sabrá que el hilo está interrumpido = (normalmente) debería detener lo que está haciendo y terminar. Como dije antes, es solo un mecanismo de comunicación. El propietario puede simplemente ignorar el estado interrumpido y no hacer nada ... pero si configura el estado interrumpido, alguien podría agradecérselo en el futuro.
Por la misma razón, nunca debes hacer
Catch(InterruptedException ie){
//ignore
}
Porque si lo haces, estás deteniendo el mensaje allí. En cambio uno debería hacer
Catch(InterruptedException ie){
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}
Si simplemente llama a interrupt()
, el hilo no se cerrará automáticamente. En cambio, el subproceso podría incluso continuar viviendo, si se isInterrupted()
se implementa en consecuencia. La única forma de cerrar un hilo de forma segura, como lo pide OP, es
Thread.currentThread().stop();
El método está en desuso, sin embargo.
La return
llamada solo regresa del método actual. Esto solo termina el hilo si estás en su nivel superior.
Sin embargo, deberías trabajar con interrupt()
y construir tu código a su alrededor.