Este... ya habran escuchado de este tema bueno, se trata de hilos con sincronizacion, no se mucho de este tema lo vi de manera superficial, estuve moniando en aqui y en internet uniendo, comparando y analizando casi linea a linea codigo que probablemente tenga mi problema pero no me fue posible encontrar dicha solucion. Disculpen todavia no dije mi problema es el siguiente:
Pasa de que tengo 5 hilos inicializados (eston son los filosofos) con un array e corriendo cada uno con un for para recorrera el array y valla a run cada uno de forma aleatoria, teniendo un syncronized para comer, pensar, esperar, saciado y otro de tenedores, pasa de que en filosofo tengo un atributo llamado platillos siendo estos la cantidad de veces que tienen que volver a comer (el numero de platillos lo genero de forma aleatoria pero que no pase de 10), que cuando el filosofo va a comer menor a un plato (el filosofo no va comer mas), quiero que se detenga y ok con lo que eh estado moniando, cuando el filosofo esta satisfecho (que termino), entonces quiero que se pause o se suspenda ese filosofo de forma que continue normalmente con los filosofos restantes pero sucede de que si utilizo el metodo ya se el de stop (detiene todos los hilos), suspend(si los suspende pero sigue un filosofo mas y no sigue con los demas ; y deberia de ser de manera aleatoria) y el join es lo mismo que lo anterior
No se que mas hacer.
Codigo:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package pFilosofo;
Este... ya habran escuchado de este tema bueno, se trata de hilos con sincronizacion, no se mucho de este tema lo vi de manera superficial, estuve moniando en aqui y en internet uniendo, comparando y analizando casi linea a linea codigo que probablemente tenga mi problema pero no me fue posible encontrar dicha solucion. Disculpen todavia no dije mi problema es el siguiente:
Pasa de que tengo 5 hilos inicializados (eston son los filosofos) con un array e corriendo cada uno con un for para recorrera el array y valla a run cada uno de forma aleatoria, teniendo un syncronized para comer, pensar, esperar, saciado y otro de tenedores, pasa de que en filosofo tengo un atributo llamado platillos siendo estos la cantidad de veces que tienen que volver a comer (el numero de platillos lo genero de forma aleatoria pero que no pase de 10), que cuando el filosofo va a comer menor a un plato (el filosofo no va comer mas), quiero que se detenga y ok con lo que eh estado moniando, cuando el filosofo esta satisfecho (que termino), entonces quiero que se pause o se suspenda ese filosofo de forma que continue normalmente con los filosofos restantes pero sucede de que si utilizo el metodo ya se el de stop (detiene todos los hilos), suspend(si los suspende pero sigue un filosofo mas y no sigue con los demas ; y deberia de ser de manera aleatoria) y el join es lo mismo que lo anterior
No se que mas hacer.
Codigo:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package pFilosofo;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author *****
*/
public class Filosofo extends Thread{
private int id;
private Tenedor left, right;
private String estado;
//private Silla s;
private int tiempo;
int platillos;
int tanda = 0;
public Filosofo(int id){
this.id = id;
}
public Filosofo(int id, Tenedor left, Tenedor right/*, Silla s*/){
this.id = id;
this.left = left;
this.right = right;
//this.s = s;
platillos = (int)(Math.random()*5+5);
estado = "pensando";
tiempo = (int)(Math.random()*7+3)*1000;
}
public void run(){
while (true){
try {
/*s.qSilla(id);
left.qTenedor(id);
right.qTenedor(id);
//comer
s.sSilla(id);
right.stenedor(id);
left.stenedor(id);*/
tanda ++;
//System.out.println("Tanda "+tanda+".");
Pensar();
} catch (InterruptedException ex) {
Logger.getLogger(Filosofo.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public synchronized void Pensar() throws InterruptedException{
estado = "pensando";
System.out.println("Filósofo "+id+" pensando...");
sleep(tiempo); // Tiempo en que piensa en filosofo
Comer();
}
public synchronized void Comer() throws InterruptedException{
System.out.println("Filósofo "+id+" Intentando Comer...");
//izq.Encolar(this);
//izq.Encolar(this);
//der.Encolar(this);
while(!TomarTenedorIzq()||!TomarTenedorDer()){
//SoltarTenedores();
//izq.estado = false;
Esperar();
//izq.DesEncolar();
//der.DesEncolar();
}
left.Encolar(this);
right.Encolar(this);
//this.izq.DesEncolar();
//der.Encolar(this);
//while(){
//der.estado = false;
//SoltarTenedores();
// Esperar();
//}
//this.der.DesEncolar();
//if(TomarTenedores() == true){
if(left.cola[0]==this && right.cola[0]==this){
this.left.DesEncolar();
this.right.DesEncolar();
left.estado = false;
right.estado = false;
estado = "comiendo";
System.out.println("Filósofo "+id+" esta "+estado+" el platillo " +platillos+ ".");
sleep(tiempo); // Tiempo en el que come el filosofo
platillos--;
SoltarTenedores();
if(platillos == 0){
Saciado();
finishFiloso();
}
else
Pensar();
}else
Comer();
//}else{
// Esperar();
//}
System.out.println("Termino la comelona");
System.out.println("Continue be...");
}
public synchronized void Saciado() {
estado = "saciado";
System.out.println("Filósofo "+id+" esta " +estado+ ".");
}
public synchronized void finishFiloso(){
try {
this.wait();
} catch (InterruptedException ex) {
Logger.getLogger(Filosofo.class.getName()).log(Level.SEVERE, null, ex);
}
}
public synchronized boolean TomarTenedorIzq(){
if(left.estado == true){
//izq.estado = false;
return true;
}
else{
return false;
}
}
public synchronized boolean TomarTenedorDer(){
if(right.estado == true){
//der.estado = false;
return true;
}
else{
return false;
}
}
public synchronized void SoltarTenedores(){
left.estado = true;
right.estado = true;
}
public synchronized void Esperar() throws InterruptedException{
//System.out.println(nombre+" esperando...");
estado = "esperando";
System.out.println("Filósofo "+id+" esta " +estado+ ".");
wait(); // Esperar a que suelten los tenedores*/
Comer();
}
}
Consola:
Filósofo 1 pensando...
Filósofo 5 pensando...
Filósofo 2 pensando...
Filósofo 3 pensando...
Filósofo 4 pensando...
Filósofo 2 Intentando Comer...
Filósofo 5 Intentando Comer...
Filósofo 2 esta comiendo el platillo 6.
Filósofo 1 Intentando Comer...
Filósofo 5 esta comiendo el platillo 6.
Filósofo 1 esta esperando.
Filósofo 3 Intentando Comer...
Filósofo 3 esta esperando.
Filósofo 2 pensando...
Filósofo 5 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 8.
Filósofo 2 Intentando Comer...
Filósofo 5 Intentando Comer...
Filósofo 2 esta comiendo el platillo 5.
Filósofo 5 esta esperando.
Filósofo 2 pensando...
Filósofo 2 Intentando Comer...
Filósofo 2 esta comiendo el platillo 4.
Filósofo 4 pensando...
Filósofo 2 pensando...
Filósofo 2 Intentando Comer...
Filósofo 2 esta comiendo el platillo 3.
Filósofo 2 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 7.
Filósofo 2 Intentando Comer...
Filósofo 2 esta comiendo el platillo 2.
Filósofo 2 pensando...
Filósofo 2 Intentando Comer...
Filósofo 2 esta comiendo el platillo 1.
Filósofo 4 pensando...
Filósofo 2 esta saciado.
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 6.
Filósofo 4 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 5.
Filósofo 4 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 4.
Filósofo 4 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 3.
Filósofo 4 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 2.
Filósofo 4 pensando...
Filósofo 4 Intentando Comer...
Filósofo 4 esta comiendo el platillo 1.
Filósofo 4 esta saciado.
PD. Ayudenmen Porfa nose que mas hacer