Métodos synchronized
Publicado por Aitor (13 intervenciones) el 09/11/2009 17:23:35
Hola,
vereis, tengo 3 clientes servidores que acceden a una seccion critica a la que solo peude acceder uno y para ello cada uno que quiere acceder pregunta a los demas si estan en ella (esto por RMI) , por tanto, en una parte del extenso codigo se trata de que espere en un wait() hasta que el otro cliente-servidor le envie un ok.
la cuestion es que declaro un metodo synchronized pq va a contener un wait dentro de el:
public synchronized void requestAccess(Client requesterClient)
....
while (votes<=listaServers.length){
try {
System.out.println("esperando en el wait ???");
wait();
System.out.println("ya no esperamos");
} catch (InterruptedException e) {e.printStackTrace();}
y en el metodo de envio de OK
declaro lo siguiente:
public synchronized void OK() {
votes++;
System.out.println("sumando votos");
notifyAll();
}
El problema, es que segun se desarrolla el programa principal, desde requestAccess accede a otro metodo, y desde este otro metodo al metodo OK(), es decir, que llega antes al notifyAll que al wait. Pero bueno, el mayor problema es que nunca llega a entrar al metodo OK, y yo deduzco que es porque es synchronized y tengo algun error de concepto.. y no se pueden declarar 2 metodos synchronized en la misma clase, o no se puede llamar desde un synchronized a otro... o que. No tengo mucha idea de threads la verdad y por mas que leo no entiendo que hago mal.
Lo que quiero es que cada vez que se llegue a la parte del codigo OK se notifique al thread que esta en wait() para que siga con la ejecucion.
No se si me he explicado bien...
Un saludo y gracias.
vereis, tengo 3 clientes servidores que acceden a una seccion critica a la que solo peude acceder uno y para ello cada uno que quiere acceder pregunta a los demas si estan en ella (esto por RMI) , por tanto, en una parte del extenso codigo se trata de que espere en un wait() hasta que el otro cliente-servidor le envie un ok.
la cuestion es que declaro un metodo synchronized pq va a contener un wait dentro de el:
public synchronized void requestAccess(Client requesterClient)
....
while (votes<=listaServers.length){
try {
System.out.println("esperando en el wait ???");
wait();
System.out.println("ya no esperamos");
} catch (InterruptedException e) {e.printStackTrace();}
y en el metodo de envio de OK
declaro lo siguiente:
public synchronized void OK() {
votes++;
System.out.println("sumando votos");
notifyAll();
}
El problema, es que segun se desarrolla el programa principal, desde requestAccess accede a otro metodo, y desde este otro metodo al metodo OK(), es decir, que llega antes al notifyAll que al wait. Pero bueno, el mayor problema es que nunca llega a entrar al metodo OK, y yo deduzco que es porque es synchronized y tengo algun error de concepto.. y no se pueden declarar 2 metodos synchronized en la misma clase, o no se puede llamar desde un synchronized a otro... o que. No tengo mucha idea de threads la verdad y por mas que leo no entiendo que hago mal.
Lo que quiero es que cada vez que se llegue a la parte del codigo OK se notifique al thread que esta en wait() para que siga con la ejecucion.
No se si me he explicado bien...
Un saludo y gracias.
Valora esta pregunta


0