martes, 15 de abril de 2014

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

Se observa que el método sleepf) puede lanzar una InterruptedException que ha de ser capturada. Así se ha hecho en este ejemplo, aunque luego no se gestiona esa excepción.
La forma preferible de detener temporalmente un thread es la utilización conjunta de los métodos waitQ y notifyAllQ. La principal ventaja del método waitQ frente a los métodos anteriormente descritos es que libera el bloqueo del objeto, por lo que el resto de threads que se encuentran esperando para actuar sobre dicho objeto pueden llamar a sus métodos. Hay dos formas de llamar a waitQ: 
1. Indicando el tiempo máximo que debe estar parado (en milisegundos y con la opción de indicar también nanosegundos). de fonna análoga a sleepf). A diferencia del método sleepf). que simplemente detiene el thread el tiempo indicado, el método waitQ establece el tiempo máximo que debe estar parado. Si en ese plazo se ejecutan los métodos notifyf) o notifyAllf) que indican la liberación de los objetos bloqueados, el thread continuará sin esperar a concluir el tiempo indicado. Las dos declaraciones del método waitQ son como siguen:
public final void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException

2. Sin argumentos, en cuyo caso el thread permanece parado hasta que sea reinicializado explícitamente mediante los métodos notifyf) o notifyAllf).
public final void wait() throws InterruptedException

Los métodos waitQ y notifyf) han de estar incluidas en un método synchronized, ya que de otra fonna se obtendrá una excepción del tipo IllegalMonitorStateException en tiempo de ejecución. El uso típico de waitQ es el de esperar a que se cumpla alguna determinada condición, ajena al propio thread. Cuando ésta se cumpla, se utilizará el método notifyAllf) para avisar a los distintos threads que pueden utilizar el objeto. Estos nuevos conceptos se explican con más profundidad en el Apartado 6.3.

No hay comentarios:

Publicar un comentario