Foro de elhacker.net

Programación => Java => Mensaje iniciado por: dePunisher en 25 Agosto 2009, 23:14 pm



Título: simular partido tenis
Publicado por: dePunisher en 25 Agosto 2009, 23:14 pm
Hola a todos!, me gustaría haceros una preguntilla...
Como podria simular lo siguiente:

En la PistaTenis, solo puede haber jugando dos personas del mismo sexo (una contra otra). Si la
pista está vacía, entra la primera persona que llegue y espera dentro de la pista hasta que llegue
otra de su mismo sexo. (Cuando haya una persona dentro de la pista, las personas de sexo
opuesto se quedarán en la puerta esperando). Cuando se juntan dos, se ponen a jugar un partido
que puede durar entre 0,5 y 1 seg. Mientras están jugando, todos los deportistas que quieran
echar un partido de tenis, tendrán que hacer cola a la entrada de la pista. Una vez terminado el
partido, abandonarán la pista y se abrirá la puerta para que entre el/la deportista que lleve más
tiempo esperando en la puerta y se comienza de nuevo el ciclo.
/*********************************************************************************************************/

Mi problema es que cuando uno se queda esperando en la cola del sexo opuesto, y le tocaria jugar, no lo hace y no entiendo porqué. Mi código es el siguiente:


public  synchronized void actualizaSaleHombre( deportista nuevoDep ){
        numH--;
        numPersonas--;
        depHombres.remove(nuevoDep);
        depInstalacion.remove(nuevoDep);
        ciudadDep.actualizaListaDepTenis();
        nuevoDep.setEntradoPista(true);
        nuevoDep.setEstado("Saliendo Tenis");
    }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private static synchronized void depHaceCola( deportista nuevoDep ) {
        depCola.add(nuevoDep);

        if (getGenero(nuevoDep)==true)  depColaMujeres.add(nuevoDep);
        else  depColaHombres.add(nuevoDep);

        nuevoDep.setEstado("Dejando cola");
    }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public synchronized void entrar ( deportista nuevoDep) {
depHaceCola(nuevoDep);

while (((numH==1)&&(getGenero(nuevoDep)== true)) || ((numM==1)&&(getGenero(nuevoDep)== false))) {
try{
nuevoDep.setEstado("Cola Tenis");
System.out.println(nuevoDep+"entrar: cola sexo opuesto");
wait();
break;
}
catch (InterruptedException e) {
if ((numH > 1)||(numM > 1)) break; else continue;
}
}
if (getGenero(nuevoDep)==true) entraMujer(nuevoDep);
else entraHombre(nuevoDep);

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void entraMujer(deportista nuevoDep){
try {sem.acquire();} catch (InterruptedException e){}

if( procesoParado() ) try {proc1.acquire();} catch (InterruptedException e){}

actualizaDejaCola(nuevoDep);

if (getEstado() == "Abierto") //si esta abierta la pista, entra
{
actualizaEntraMujer(nuevoDep);

System.out.println(nuevoDep+" ESTA ABIERTO numM="+numM);

if (numM==1) { //si soy el primero en entrar a la pista..
//establezco duracion del partido
partido = duracionPartido();

while (true) {
try {
System.out.println(nuevoDep+" espero compañero");
wait();
break;
}
catch (InterruptedException e) {
if (numM > 1) break; else continue;
}
}
}

System.out.println(nuevoDep+"jugara :"+partido);

nuevoDep.setEstado("Jugando Tenis");

try {nuevoDep.sleep(partido);} catch (InterruptedException e1){}

if( procesoParado() )
try {proc2.acquire();} catch (InterruptedException e){}

nuevoDep.setEntradoPista(true);
actualizaSaleMujer(nuevoDep);

if (numM==0) {//si es la ultima, dejo pasar a los siguientes
sem.release();
sem.release();
}
}
System.out.println(nuevoDep+" nuevoDep salgo y libero semaforo semM: "+sem+" y numM: "+numM);
}

/*****************************************************************************************************/
Muchas gracias, espero que se te ocurra algo :( llevo un par de semanas atascada...


Título: Re: simular partido tenis
Publicado por: kinos en 26 Agosto 2009, 00:16 am
Mira a ver si se te queda algún proceso durmiendo y no despierta.

A mi me ha pasao alguna vez que se me quedaba esperando en un objeto, una cola y si no lo despiertas haciendo una llamada a ese objeto... nada de nada.

Código
  1. //esto en la cola
  2. public synchronized void terminarProcesosEnEspera() {
  3.        salir = false;
  4.        notifyAll();
  5.    }
  6.  

La variable salir la utilizo porque al sacar de la cola y ser vacia(por eso espera) no me permite sacar en el metodo dequeue.

Escribe instrucciones System.out.println() a tutiplén a ver donde se te queda dormido o depuralo.


Título: Re: simular partido tenis
Publicado por: dePunisher en 26 Agosto 2009, 10:53 am
Lo que me pasa es eso, que en un momento dado, uno no se despierta y ya fastidia a los demas. Pero porqué sí que despiertan los anteriores y él no? No entiendo porque a veces funciona y otras veces no...

Muchas gracias