domingo, 17 de noviembre de 2013

FILÓSOFOS COMENSALES


FILÓSOFOS COMENSALES


Veamos el problema.

Érase una vez cinco filósofos que vivían juntos. La vida de cada filósofo consistía principal-mente en pensar y comer y, tras años de pensar, todos los filósofos se habían puesto de acuerdo en que la única comida que contribuía a sus esfuerzos pensadores eran los espaguetis.

Los preparativos de la comida eran simples: una mesa redonda en la que había una gran fuente de espaguetis, cinco platos, uno para cada filósofo y cinco tenedores. Un filósofo que quiera comer irá a su lugar asignado en la mesa y, usando los dos tenedores de cada lado del plato, cogerá los espaguetis y se los comerá. El problema es el siguiente: Inventar un ritual (algoritmo) que permita comer a los filósofos. El algoritmo debe satisfacer la exclusión mutua (dos filósofos no pueden emplear el mismo tenedor a la vez), además de evitar el interbloqueo y la inanición

En clase dimos la solución a este problema mediante un  algoritmo pero quisimos aportar un poco mas y dejar un código en java que ilustra la solución a este requerimiento.

Creamos una clase llamada controlador
*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package filosofos;

/**
 *
 * @author PERSONAL
 */
public class Controlador {
    private static final int pensando = 0;
private static final int hambriento = 1;
private static final int comiendo = 2;
private int n; //numero de filosofos
private int estado[];  
public Controlador(int n) {
this.n = n;
estado = new int[n]; //estado del filosofo
}
// EL FILOSOFO id intenta SUS TENEDORES
public synchronized void tomarTenedores(int id) {

estado[id] = hambriento; // establece que tiene hambre
prueba(id);
while (estado[id] != comiendo) // ESPERA x 2 TENEDORES
try { wait(); 
} catch (Exception e) { System.out.println(e);}
}
// EL FILOSOFO id SUELTA SUS TENEDORES
public synchronized  void soltarTenedores(int id) {
int der, izq;
//calcula la posicion a su derecha e izq.
der=(id+1) % n; 
izq=id-1;
if (izq<0)
                    izq=n-1;
                estado[id] = pensando; 
//checa si alguno está a la espera hambriento
prueba(izq);
prueba(der);
}
//Prueba si los dos filosofos a su lado no estan
//comiendo
public  void prueba(int id){
int der, izq;
//calcula la posicion a su derecha e izq.
der=(id+1) % n; 
izq=id-1;
if (izq<0)
izq=n-1;
if( estado[id] == hambriento && estado[izq]!= comiendo 
   && estado[der]!= comiendo){
    estado[id] = comiendo;
    notifyAll();
}
}

}

Seguidamente creamos otra llamada filosofo
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package filosofos;

/**
 *
 * @author PERSONAL
 */
public class Filosofo extends Thread {
private int id;
private Controlador controlador;
private int nComidas;
public Filosofo(int id,Controlador c) {
this.id=id;
controlador=c;
nComidas = 0;
}
//el filosofo pasa un tiempo pensando
public void pensando(){
System.out.println("Filosofo "+id+" pensando");
try {
Thread.sleep((int)(Math.random()*400));
} catch (Exception e) {
System.out.println(e);}
}
//el filosofo toma un tiempo comiendo
public void comer(){
nComidas++;
System.out.println("Filosofo "+id+" comiendo -> Numero comidas:"+nComidas);
try {
Thread.sleep((int)(Math.random()*500));
} catch (Exception e) {
System.out.println(e); }
}
public void run() {
do {
pensando(); //el filosofo pasa un tiempo pensando
controlador.tomarTenedores(id); //intenta tomar tenedores
// Si tiene 2 tenedores;
comer();
controlador.soltarTenedores(id);
} while (true);
}
   
}
y por ultimo creamos la clase llamada filósofos que es donde daremos uso a nuestro codigo espero les guste y sea de fácil entendimiento
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package filosofos;

/**
 *
 * @author PERSONAL
 */
public class Filosofos {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     Controlador c=new Controlador(5); // 5 FILOSOFOS
Filosofo f[] =new Filosofo[5]; 
for (int cont=0;cont<5;cont++) {
f[cont]=new Filosofo(cont,c);
f[cont].start();
}
//dejamos pasar un tiempo y terminamos los hilos
try {
Thread.sleep((int)(8000));
} catch (Exception ex1) { System.out.println(ex1);}
System.exit(0);               
    }
    }




1 comentarios: