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...
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...