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