lunes, 14 de abril de 2014

Detener un Thread temporalmente: Runnable - Not Runnable - Part 2

Si lo que se desea es parar o bloquear temporalmente un thread (pasar al estado Not Runnable). existen varias formas de hacerlo: 
1. Ejecutando el método sleepf) de la clase Thread. Esto detiene el thread un tiempo pre- establecido. De ordinario el método sleep() se llama desde el método run(). 
2. Ejecutando el método waitf) heredado de la clase Object. a la espera de que suceda algo que es necesario para poder continuar. El thread volverá nuevamente a la situación de runnable mediante los métodos notifyQ o notifyAllQ, que se deberán ejecutar cuando cesa la condición que tiene detenido al thread (ver Apartado 6.3. en la página 131). 
3. Cuando el thread está esperando para realizar operaciones de Entrada Salida o Input Output (E/S ó I/O). 
4. Cuando el thread está tratando de llamar a un método synchronized de un objeto, y dicho objeto está bloqueado por otro thread (véase el Apartado 6.3) 
Un thread pasa automáticamente del estado Not Runnable a Runnable cuando cesa alguna de las condiciones anteriores o cuando se llama a notify() o notifyAUQ.
La clase Thread dispone también de un método stop(). pero no se debe utilizar ya que puede provocar bloqueos del programa (deadlock). Hay una última posibilidad para detener un thread. que consiste en ejecutar el método suspendQ. El thread volverá a ser ejecutable de nuevo ejecutando el método resumef). Esta última fonna también se desaconseja, por razones similares a la utilización del método stop(). 
El método sleepf) de la clase Thread recibe como argumento el tiempo en milisegundos que ha de permanecer detenido. Adicionalmente. se puede incluir un número entero con un tiempo adicional en nanosegnndos. Las declaraciones de estos métodos son las siguientes:

public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanosecons) throws InterruptedException

Considérese el siguiente ejemplo:
System.out.println ("Contador de segundos");
int count=0;
public void run () {
try {
sleep(lOOO);
System.out.println(count++) ;
} catch (InterruptedException e){}
}

No hay comentarios:

Publicar un comentario