EN ESTE LINK http://www.labc.usb.ve/jregidor/EC3731/pdfs/TareaI... VIENE UN PROBLEMA LLAMADO LA CENA DE LOS FILOSOFOS, Y LA CUESTION AQUI ES HACER UN PROBLEMA ACERCA DE ESTO NADA MAS ES EL PROBLEMA 1.
Tienes que usar Threads y semaforos.
package concurrente.filosofos;
/*Clase Principal del programa*/
public class Filosofos{
public static void main( String args[] )
{
Tenedor tenedor[]=new Tenedor[5];
/*Instancias de los 5 tenedores */
tenedor[0]=new Tenedor(0);
tenedor[1]=new Tenedor(1);
tenedor[2]=new Tenedor(2);
tenedor[3]=new Tenedor(3);
tenedor[4]=new Tenedor(4);
Filosofo filosofo[]=new Filosofo[5];
/*instancias de los cinco filosofos*/
filosofo[0]=new Filosofo(0,tenedor[0],tenedor[1]);
filosofo[1]=new Filosofo(1,tenedor[1],tenedor[2]);
filosofo[2]=new Filosofo(2,tenedor[2],tenedor[3]);
filosofo[3]=new Filosofo(3,tenedor[3],tenedor[4]);
filosofo[4]=new Filosofo(4,tenedor[4],tenedor[0]);
/*Comienza la ejecucion de los filosofos*/
filosofo[0].start();
filosofo[1].start();
filosofo[2].start();
filosofo[3].start();
filosofo[4].start();
}
import java.lang.*;
import java.util.Random;
public class Filosofo extends Thread {
private int identificativo;
private Tenedor izquierda;
private Tenedor derecha;
private Random random;
private boolean izquierdatomado;
private boolean derechatomado;
private int elegido;
private boolean flag;
Filosofo(int identificativo_, Tenedor izquierda_, Tenedor derecha_)
identificativo=identificativo_;
izquierda=izquierda_;
derecha=derecha_;
random = new Random();
public void pensar()
try
this.sleep(10000);
}catch(InterruptedException ie)
public void comer()
System.out.println("comiendo...");
System.out.println(identificativo);
System.out.println("terminando de comer...");
public void run()
while(true)
this.pensar();
flag=false;
elegido=random.nextInt(2);
if(elegido==0)
if(!izquierda.esocupado())
izquierda.tomar();
izquierdatomado=true;
else if(!derecha.esocupado())
derecha.tomar();
derechatomado=true;
else if(elegido==1)
if(!derecha.esocupado())
else if(!izquierda.esocupado())
if(izquierdatomado==true)
flag=true;
else
izquierda.soltar();
izquierdatomado=false;
if(derechatomado==true && !flag)
derecha.soltar();
derechatomado=false;
if(derechatomado && izquierdatomado)
this.comer();
/* Clase Tenedor */
public class Tenedor {
private boolean ocupado=false;
Tenedor(int identificativo_)
identificativo = identificativo_;
/*Accion de soltar tenedor*/
synchronized void dejar()
ocupado=false;
notify();
/*Comprobar si el tenedor esta ocupado*/
synchronized boolean esocupado()
if(ocupado)
return true;
return false;
/*Accion de tomar el tenedor*/
synchronized void tomar()
ocupado=true;
void soltar()
Copyright © 2024 Q2A.ES - All rights reserved.
Answers & Comments
Verified answer
Tienes que usar Threads y semaforos.
package concurrente.filosofos;
/*Clase Principal del programa*/
public class Filosofos{
public static void main( String args[] )
{
Tenedor tenedor[]=new Tenedor[5];
/*Instancias de los 5 tenedores */
tenedor[0]=new Tenedor(0);
tenedor[1]=new Tenedor(1);
tenedor[2]=new Tenedor(2);
tenedor[3]=new Tenedor(3);
tenedor[4]=new Tenedor(4);
Filosofo filosofo[]=new Filosofo[5];
/*instancias de los cinco filosofos*/
filosofo[0]=new Filosofo(0,tenedor[0],tenedor[1]);
filosofo[1]=new Filosofo(1,tenedor[1],tenedor[2]);
filosofo[2]=new Filosofo(2,tenedor[2],tenedor[3]);
filosofo[3]=new Filosofo(3,tenedor[3],tenedor[4]);
filosofo[4]=new Filosofo(4,tenedor[4],tenedor[0]);
/*Comienza la ejecucion de los filosofos*/
filosofo[0].start();
filosofo[1].start();
filosofo[2].start();
filosofo[3].start();
filosofo[4].start();
}
}
package concurrente.filosofos;
package concurrente.filosofos;
import java.lang.*;
import java.util.Random;
public class Filosofo extends Thread {
private int identificativo;
private Tenedor izquierda;
private Tenedor derecha;
private Random random;
private boolean izquierdatomado;
private boolean derechatomado;
private int elegido;
private boolean flag;
Filosofo(int identificativo_, Tenedor izquierda_, Tenedor derecha_)
{
identificativo=identificativo_;
izquierda=izquierda_;
derecha=derecha_;
random = new Random();
}
public void pensar()
{
try
{
this.sleep(10000);
}catch(InterruptedException ie)
{
}
}
public void comer()
{
try
{
System.out.println("comiendo...");
System.out.println(identificativo);
this.sleep(10000);
System.out.println("terminando de comer...");
System.out.println(identificativo);
}catch(InterruptedException ie)
{
}
}
public void run()
{
while(true)
{
this.pensar();
flag=false;
elegido=random.nextInt(2);
if(elegido==0)
{
if(!izquierda.esocupado())
{
izquierda.tomar();
izquierdatomado=true;
}
else if(!derecha.esocupado())
{
derecha.tomar();
derechatomado=true;
}
}
else if(elegido==1)
{
if(!derecha.esocupado())
{
derecha.tomar();
derechatomado=true;
}
else if(!izquierda.esocupado())
{
izquierda.tomar();
izquierdatomado=true;
}
}
if(izquierdatomado==true)
{
if(!derecha.esocupado())
{
derecha.tomar();
derechatomado=true;
flag=true;
}
else
{
izquierda.soltar();
izquierdatomado=false;
}
}
if(derechatomado==true && !flag)
{
if(!izquierda.esocupado())
{
izquierda.tomar();
izquierdatomado=true;
}
else
{
derecha.soltar();
derechatomado=false;
}
}
if(derechatomado && izquierdatomado)
{
this.comer();
elegido=random.nextInt(2);
if(elegido==0)
{
izquierda.soltar();
izquierdatomado=false;
derecha.soltar();
derechatomado=false;
}
else
{
derecha.soltar();
derechatomado=false;
izquierda.soltar();
izquierdatomado=false;
}
}
}
}
}
package concurrente.filosofos;
package concurrente.filosofos;
/* Clase Tenedor */
public class Tenedor {
private boolean ocupado=false;
private int identificativo;
Tenedor(int identificativo_)
{
identificativo = identificativo_;
}
/*Accion de soltar tenedor*/
synchronized void dejar()
{
ocupado=false;
notify();
}
/*Comprobar si el tenedor esta ocupado*/
synchronized boolean esocupado()
{
if(ocupado)
{
return true;
}
else
{
return false;
}
}
/*Accion de tomar el tenedor*/
synchronized void tomar()
{
ocupado=true;
}
void soltar()
{
ocupado=false;
}
}