Los métodos notifyf) y notifyAllf) deben ser llamados desde el thread que tiene bloqueado el
objeto para activar el resto de threads que están esperando la liberación de un objeto. Un thread se
convierte en propietario del bloqueo de un objeto ejecutando un método sincronizado del objeto.
Los bloqueos de tipo clase, se consiguen ejecutando un método de clase sincronizado
(synchronized static). Véanse las dos funciones siguientes, de las que putf) inserta un dato y getf) lo
recoge:
public
synchronized int get() {
while (available == false) {
try {
while (available == false) {
try {
// Espera a que put() asigne el valor y lo
comunique con notifyf)
wait();
wait();
} catch
(InterruptedException e) { }
}
available =
false;
// notifica que el valor ha sido leido
notifyAll();
// devuelve el valor
return contents;
notifyAll();
// devuelve el valor
return contents;
}
public
synchronized void put(int valué) {
while (available == true) {
try {
while (available == true) {
try {
// Espera a que get() lea el valor disponible
antes de darle otro
wait () ;
wait () ;
} catch (InterruptedException e) { }
}
// ofrece un nuevo valor y lo declara
disponible
contents = valué;
available = true;
// notifica que el valor ha sido cainbiado
notifyAll();
notifyAll();
}
No hay comentarios:
Publicar un comentario