Java - Hilos monitor

 
Vista:
sin imagen de perfil

Hilos monitor

Publicado por tryky (1 intervención) el 15/10/2021 19:38:33
Hola : )

en esta app lanzo unos cuantos hilos que tienen que pasar por un monitor, método synchronized.
El problema es que hay unos hilos que se lanzan sin pasar por unas condiciones.

ya no se que hacer (soy novato con la programación estoy empezando). Seguramente este todo mal jajaj

Muchas gracias antemano os adjunto el código, contiene cuatro clases.

Clase despacho:
Es una sala donde un profesor hace tutorias con alumnos y una sala de espera con cuatro sillas.
Cuando la sala del profesor esta llena, esperan en la sala de espera.
Si la sala de espera esta llena se van y pasados unos segundos acaba charla

Clase alumno:
mientra la charla no termine.
llama al método entrar si charla ha acabado sale del bucle sino espera y vuelve.

Clase principal:
Crea alumnos y profesor y enciende hilos.


Clase profesor:
se queda esperando a alumno y cuando acaba de hablar

/**esta es la clase que se usa de monitor, en el metodo entrar es donde me surge el problema
*
* @author tomas
*/
public class Despatx {

private int nSillas;
private int nSillasOcupadas = 0;
private boolean sillaProfeOcupada = false;
private boolean finCharla = false;
private boolean profeDormido = false;

public Despatx(int nCadires) {
this.nCadires = nCadires;
}

public synchronized boolean entrar(int alumneId) throws InterruptedException {

// IMPLEMENTA
if (nSillasOcupadas == nCadires) {
System.out.println("--- Alumno " + alumneId + " se va sin hablar");
return false;
} else {

if (profeDormit) {

System.out.println("---- L'alumne " + alumneId + " desperta al profe");
profeDormit=false;
notifyAll();
}
if(!profeDormit) {
nCadiresOcupades++;


if(cadiraProfeOcupada) {
System.out.println("Alumne " + alumneId + " seu a la sala d'espera");

wait();



}


if(!cadiraProfeOcupada) {

cadiraProfeOcupada=true;
System.out.println("Alumne " + alumneId + " entra a la sala profesor");

nCadiresOcupades--;

wait();
notify();




System.out.println("Alumne " + alumneId + " marxa despres de xerrar");
cadiraProfeOcupada=false;
fiXerrada=true;


}

}



}







return fiXerrada;

}

public synchronized void esperarAlumne() throws InterruptedException {

// IMPLEMENTA
if(nCadiresOcupades == 0) {
profeDormit=true;
System.err.println("n cadires ocupader " + nCadiresOcupades + ".");
wait();


}

}

public synchronized void acabarXerrada() {

// IMPLEMENTA


// System.err.println("profesor no queda esperant");

notifyAll();




}

}


public class Professor extends Thread {

private Despatx despatx;

public Professor(Despatx despatx) {
this.despatx = despatx;
}



public void run() {

while (true) {

try {
despatx.esperarAlumne();
//Parlar amb l'alumne
sleep(5000);
despatx.acabarXerrada();
//Decansa una mica
sleep(1000);
} catch (InterruptedException e) {
}
}

}
}

public class Alumne extends Thread {

private final Despatx despatx;
private final int alumneId;
private boolean fiXerrada = false;

public Alumne(Despatx despatx, int alumneId) {
this.despatx = despatx;
this.alumneId = alumneId;
}


@Override
public void run() {

while (!fiXerrada) {

try {
sleep(2000);
fiXerrada = despatx.entrar(alumneId);
//Xerrada
if (!fiXerrada) {

//M'espero i ho torno a intentar
sleep(4000);
}
} catch (InterruptedException e) {
}

}
}
}



public class DamM9 {


public static void main(String[] args) {

final int nCadires = 3;
final int nAlumnes = 10;
Despatx despatx = new Despatx(nCadires);
Professor tomas = new Professor(despatx);
Alumne[] alumnes = new Alumne[nAlumnes];

//IMPLEMENTA


tomas.start();

for(int i=0; i<5;i++) {

alumnes[i] = new Alumne(despatx, i+1);



}

alumnes[0].start();
alumnes[1].start();
alumnes[2].start();
alumnes[3].start();
alumnes[4].start();


try {
alumnes[0].join();
alumnes[1].join();
alumnes[2].join();
alumnes[3].join();
alumnes[4].join();


} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


System.out.println("fi fil principal");

}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder