Java - Cena de filosofos

 
Vista:

Cena de filosofos

Publicado por nti (1 intervención) el 13/01/2016 00:08:02
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
 * 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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Cena de filosofos

Publicado por arck (145 intervenciones) el 13/01/2016 10:28:28
A ver si me entero, hay 5 filosofos, entre cada filosofo un palillo y cada filosofo tiene un plato, para comer cada filosofo necesita 2 palillos, primero el izquierdo y después el derecho (según lei por internet).
entonces.
¿Cuando un filosofo esta saciado sigue en la mesa pero no come?

Si puedes poner el flujo de un filosofo y así me entero de a que te refieres, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cena de filosofos

Publicado por Locotron123 (1 intervención) el 05/12/2018 19:31:46
Podrías subir la clase Tenedor por favor? Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar