Filósofos con hilos en Java

DESCARGAR



public class filosofos {

public static void main(String[] args) {
//generar filosofos
//filosofo = hilo de ejecucion

Mesa mesa = new Mesa();
for (int i = 0; i < 5; i++) {
new Thread(new Filosofo(i+1,mesa)).start();
}

}

}





public class Filosofo implements Runnable {

private int numFilosofo;
private Mesa mesa;
public Filosofo(int filo, Mesa table){
numFilosofo=filo;
mesa=table;
System.out.println("Filosofo "+numFilosofo+" creado.");
}

@Override
public void run() {
try{
while(true){

pensar();

comer();
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}

private void comer() throws InterruptedException {
System.out.println("Filosofo "+numFilosofo+" intentando comer.");
mesa.obtenTenedor(numFilosofo,(numFilosofo-1)%5);
mesa.obtenTenedor(numFilosofo, numFilosofo%5);
System.out.println("Filosofo "+numFilosofo+" comiendo.");
Thread.sleep(2000);
mesa.devolverTenedor(numFilosofo, numFilosofo%5);
mesa.devolverTenedor(numFilosofo, (numFilosofo-1)%5);
}

private void pensar() throws InterruptedException {
System.out.println("Filosofo "+numFilosofo+" pensando.");
Thread.sleep(2000);
}


}








public class Mesa {
private boolean[] HayTenedor = new boolean[]{true, true, true, true, true};
public int filosofosMesa = 0;
public synchronized void obtenTenedor(int numFilosofo, int numTenedor) {
while(!HayTenedor[numTenedor]){
try {
wait();//espera hasta que llegue el tenedor
} catch (InterruptedException e) {
e.printStackTrace();
}
}
while(HayTenedor[numTenedor]){
System.out.println("Filosofo "+numFilosofo+" toma tenedor "+ numTenedor);
HayTenedor[numTenedor]=false;
}
}

public synchronized void devolverTenedor(int numFilosofo, int numTenedor) {
System.out.println("Filosofo "+numFilosofo+" devuelve tenedor "+ numTenedor);
HayTenedor[numTenedor]=true;
notifyAll();//avisa de que ha devuelto el tenedor
}
public synchronized void pedirMesa(int numFilosofo){
while(filosofosMesa==2){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Filosofo "+numFilosofo+" se pone en mesa.");
filosofosMesa++;
}
public synchronized void devolverMesa(int numFilosofo){
filosofosMesa--;
System.out.println("Filosofo "+numFilosofo+" deja la mesa.");
// if(filosofosMesa==1){
// notifyAll();
// }
}
}