Article View: es.comp.lenguajes.java
Article #28137Re: Ayuda programando concurrente
From: Chano G�mez
Date: Mon, 08 Jun 1998 00:00
Date: Mon, 08 Jun 1998 00:00
128 lines
4045 bytes
4045 bytes
Este es un mensaje multipartes en formato MIME.
--------------806B98E9A86DFC1ED2BEC80D
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
> > Al cabo de un tiempode bloquean los 5 fil�sofos con su tenedor derecho en la
> > mano.
> > �Qu� hay que variar en el programa para garantizar que no se interbloqueen
> > los fil�sofos.
Aqu� va una propuesta de programa de los 5 fil�sofos. Funciona sin bloquearse, pero
es mejorable. Por ejemplo, no resuelve el problema que surge si los 5 cogen su
tenedor izquierdo al mismo tiempo, encuentran el derecho ocupado al mismo tiempo,
sueltan el tenedor al mismo tiempo, duermen el mismo intervalo de tiempo (aunque el
tiempo se obtiene de una n�mero aleatorio), vuelven a coger el tenedor izquierdo al
mismo tiempo, etc...
La probabilidad de que ocurra esto es �nfima, pero estar�a bien eliminarla.
�A alguien se le ocurre alguna forma de eliminarla sin que tenga que haber
comunicaci�n entre los fil�sofos? (En esta versi�n del programa, cada fil�sofo se
preocupa de sus tenedores y de nada m�s.)
Chano.
--------------806B98E9A86DFC1ED2BEC80D
Content-Type: text/plain; charset=iso-8859-1; name="filosofos.java"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="filosofos.java"
class tenedor{
private boolean cogido=false;
public synchronized boolean cogerTenedor(){
if(!cogido){
cogido = true;
return true;
}
else{
return false;
}
}
public synchronized void soltarTenedor(){
cogido = false;
}
}
class filosofo implements Runnable{
final static int TIEMPO_COMER = 200;
final static int TIEMPO_PENSAR = 200;
private tenedor izquierda, derecha;
String nombre;
int numeroComidas;
public filosofo(tenedor i, tenedor d, String n){
izquierda = i;
derecha = d;
nombre = n;
numeroComidas = 0;
new Thread(this).start();
}
public void run(){
while(true){
pensar();
comer();
}
}
void pensar(){
System.out.println("soy el fil�sofo " + nombre + " y estoy pensando");
try{
Thread.sleep((int)(Math.random()*TIEMPO_PENSAR));
}
catch(InterruptedException ie){}
}
void comer(){
System.out.println("soy el fil�sofo " + nombre + " y tengo hambre");
if(!izquierda.cogerTenedor()){
System.out.println("soy el fil�sofo " + nombre + " y no he podido coger el tenedor de la izquierda");
return;
}
if(!derecha.cogerTenedor()){
System.out.println("soy el fil�sofo " + nombre + " y no he podido coger el tenedor de la derecha");
izquierda.soltarTenedor();
return;
}
try{
numeroComidas++;
System.out.println("soy el fil�sofo " + nombre + " y estoy comiendo [" + numeroComidas + " veces]");
Thread.sleep((int)(Math.random()*TIEMPO_COMER));
}
catch(InterruptedException ie){}
izquierda.soltarTenedor();
derecha.soltarTenedor();
}
}
class congreso{
final static int numeroFilosofos = 5;
public static void main(String args[]){
tenedor[] tenedores = new tenedor[numeroFilosofos];
filosofo[] filosofos = new filosofo[numeroFilosofos];
for(int n=0;n<numeroFilosofos;n++){
tenedores[n]=new tenedor();
}
for(int n=0;n<numeroFilosofos;n++){
int izq = n;
int der = (n+1) % numeroFilosofos;
filosofos[n]=new filosofo(tenedores[izq],tenedores[der],"" + n);
}
}
}
--------------806B98E9A86DFC1ED2BEC80D--
Technical Details
Message-ID:
<357C03C3.E504E1A7@ran.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<6l422i$sgc$1@talia.mad.ibernet.es> <3579C61F.30458F1A@ran.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 1116f3,bc5b8bab3abb1a43 X-Google-Attributes: gid1116f3,public From: "Chano G�mez" <chano@ran.es> Subject: Re: Ayuda programando concurrente Date: 1998/06/08 Message-ID: <357C03C3.E504E1A7@ran.es> X-Deja-AN: 360758333 References: <6l422i$sgc$1@talia.mad.ibernet.es> <3579C61F.30458F1A@ran.es> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------806B98E9A86DFC1ED2BEC80D" Organization: Telefonica Transmision de Datos Newsgroups: es.comp.lenguajes.java