elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  simular partido tenis
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: simular partido tenis  (Leído 2,978 veces)
dePunisher

Desconectado Desconectado

Mensajes: 2


Ver Perfil
simular partido tenis
« 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...


En línea

kinos

Desconectado Desconectado

Mensajes: 104



Ver Perfil
Re: simular partido tenis
« Respuesta #1 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.


En línea

dePunisher

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: simular partido tenis
« Respuesta #2 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines