Java - 4 regiones críticas a elegir

 
Vista:

4 regiones críticas a elegir

Publicado por kaidok (1 intervención) el 29/11/2006 11:40:25
Pues lo que busco es que haya cuatro regiones críticas disponibles y si hay una libre el hilo la coja.
Especificando más el objetivo la idea es que hay 4 muelles y unos camiones rondando lo que se busca es que si un muelle está libre , el primer camión que llegue lo ocupe, el segundo ve que el primero está ocupado entonces se va al segundo, el tercero al tercero y así. El quinto ve que no tiene ninguno libre y se espera hasta que alguno quede libre uno de los muelles.

Pongo el código para que se entienda mejor:



class Muelle1 extends Thread
{
protected int muelle=0;


public synchronized void incrementaMuelle() {

if (muelle<1) {
this.muelle=this.muelle+1;

} else {
try {
System.out.println(currentThread().getName()+"buscando un muelle que esté libre");
System.out.println(muelle);

} catch (Exception ex) {
ex.printStackTrace();
}
}
}



//Devuelve el valor actual del contador
public int getMuelle()
{
return this.muelle;


}

public synchronized void decrementaMuelle() {

this.muelle=this.muelle-1;
if (getMuelle()<=0) {
this.muelle=0;

} else {


}
}

//Establece el valor actual del contador
public void setMuelle(int val)
{
this.muelle=val;
}
}

class Hilo extends Thread {
boolean ya=false;
int contador=0;
Contador cont=new Contador();
Muelle1 muelle1;
Muelle1 muelle2;
Muelle1 muelle3;
Muelle1 muelle4;
Hilo(String p_nombre,Contador p_cont,Muelle1 muelle1,Muelle1 muelle2,Muelle1 muelle3, Muelle1 muelle4) {
super(p_nombre);
this.cont=p_cont;
this.muelle1=muelle1;
this.muelle2=muelle2;
this.muelle3=muelle3;
this.muelle4=muelle4;
}
//Método para incrementar el contador
public void run() {
while (true) {
System.out.println("Camión esperando para cargar");

try
{
{



if (muelle1.getMuelle()==0)
{
muelle1.incrementaMuelle();
yield();
System.out.println(currentThread().getName()+"cargando en el muelle 1");
sleep(20);
System.out.println(currentThread().getName()+"ha sido cargado");
muelle1.decrementaMuelle();
ya=true;
}

if (ya==false)
{
if (muelle2.getMuelle()==0)
{
muelle2.incrementaMuelle();
yield();
System.out.println(currentThread().getName()+"cargando en el muelle 2");
sleep(20);
System.out.println(currentThread().getName()+"ha sido cargado");
muelle2.decrementaMuelle();
ya=true;
}
}

if (ya==false)
{
if (muelle3.getMuelle()==0)
{

muelle3.incrementaMuelle();
yield();
System.out.println(currentThread().getName()+"cargando en el muelle 3");
sleep(20);
System.out.println(currentThread().getName()+"ha sido cargado");
muelle3.decrementaMuelle();
ya=true;
}
}

if (ya==false)
{
if (muelle4.getMuelle()==0)
{
muelle4.incrementaMuelle();
yield();
System.out.println(currentThread().getName()+"cargando en el muelle 4");
sleep(20);
System.out.println(currentThread().getName()+"ha sido cargado");
muelle4.decrementaMuelle();
ya=true;
}
}

if ((muelle1.getMuelle()==1) && (muelle2.getMuelle()==1) && (muelle3.getMuelle()==1) && (muelle4.getMuelle()==1))
{
wait();
}
else
{
notify();
}


}
}
catch (InterruptedException e) {
System.out.println("Interrupción del hilo..." );
}

La idea es que se vayan revisando las regiones 1 por 1 si la 1 si el contador es 0 se incrementa, sino se prueba con la 2 sino con la 3... en caso de que estén las 4 ocupadas que se esperen y cuando quede alguna libre un notify() para que se enteren los dormidos. Además para impedir que el mismo hilo pueda recorrer todas las regiones se hace uso del ya y además se deja de inmediato que otro entre con el yield(), pero el código en ejecución da errores y más errores...



A ver si me podéis ayudar, saludos.
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