Sunteți pe pagina 1din 3

David Gonzlez Segundo

SISTEMAS OPERATIVOS
ICO-16
Fecha: 20/Agosto/2014

CENA DE LOS FILOSOFOS

PROPOSITO: simular el algoritmo de la cena de los filsofos mediante el uso de un


entorno de desarrollo integrado y se aplicara el uso de los hilos en forma
sincronizada.

CODIGO FUENTE EN JAVA


package la.cena.de.los.filosofos;
import java.util.Random;
import java.util.concurrent.Semaphore;

public class Filosofo extends Thread {


/**
*/
private final int idFilosofo;
private final Semaphore[] palillos_semaforo;
private final int[][] palillosFilosofo;
private final int palilloIzquierdo;
private final int palilloDerecho;
private final Random tiempoAleatorio = new Random();

public Filosofo(int idFilosofo, Semaphore[] palillos_semaforo, int[][]


palillosFilosofo) {
this.idFilosofo = idFilosofo;
this.palillos_semaforo = palillos_semaforo;
this.palillosFilosofo = palillosFilosofo;
this.palilloIzquierdo = palillosFilosofo[idFilosofo][0];
this.palilloDerecho = palillosFilosofo[idFilosofo][1];
}

protected void comer()


{
if (palillos_semaforo[palilloIzquierdo].tryAcquire()) {
if (palillos_semaforo[palilloDerecho].tryAcquire()) {
System.out.println("FILSOFO " + idFilosofo + " EST
COMIENDO.");
try {
sleep(tiempoAleatorio.nextInt(1000) + 500);
} catch (InterruptedException ex) {
System.out.println("Error : " + ex.toString());
}
System.out.println("Filsofo " + idFilosofo + " ha terminado de
comer.Libera los palillos " + palilloIzquierdo + " y " + palilloDerecho);
// Ya que ha terminado de comer libera el semforo-palillo de
su derecha:
palillos_semaforo[palilloDerecho].release();
}
// Y libera tambin el semforo palillo de su izuierda.
palillos_semaforo[palilloIzquierdo].release();
} else { // el filsofo no ha podido coger el pallillo, no puede comer.
System.out.println("Filsofo " + idFilosofo + " est
hambriento.");
}
}

protected void pensar() {


System.out.println("Filsofo " + idFilosofo + " est pensando.");
try {
Filosofo.sleep(tiempoAleatorio.nextInt(1000) + 100);
} catch (InterruptedException ex) {
System.out.println("Error en el mtodo pensar(): " +
ex.toString());
}
}

/**
* Bucle infinito: ... -> llamar al mtodo pensar() -> Llamar al
mtodo comer() ...
*/
@Override
public void run() {
while (true) {
pensar();
comer();
}
}
}

package la.cena.de.los.filosofos;
import java.util.concurrent.Semaphore;
public class LaCenaDeLosFilosofos {
/**
* La cantidad de filsofos
*/
final static int numeroFilosofos = 5;
*/
final static int[][] palillosFilosofo = {
{0, 4}, // filosofo 0
{1, 0}, // filosofo 1
{2, 1}, // filosofo 2
{3, 2}, // filosofo 3
{4, 3} // filosofo 4
};
final static Semaphore[] palillos_semaforo = new Semaphore[numeroFilosofos];

public static void main(String[] args)


{
for (int i = 0; i < numeroFilosofos; i++) {
palillos_semaforo[i] = new Semaphore(1);
}

for (int idFilosofo = 0; idFilosofo < numeroFilosofos; idFilosofo++) {


new Filosofo(idFilosofo, palillos_semaforo,
palillosFilosofo).start();
}
}
}

RESULTADO

S-ar putea să vă placă și