O Jantar dos Filósofos
Autor: Daniel Gomes | Publicado: 2010-10-28T17:30:00-02:00

Tenho aprendido muita coisa na faculdade. Estou no 3º semestre de Análise e Desenvolvimento de Sistemas na FATEC, e na disciplina de Sistemas Operacionais o professor, que é tarado por Java, propôs que resolvêssemos o clássico problema dos filósofos jantando (criado por Dijkstra) em Java. (óbvio)

Eis minha implementação inicial:

Classe principal (Jantar)
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.concurrent.Semaphore;

import javax.swing.*;

public class Jantar {
public static int maxComendo, comendo;
public static JLabel lblMaxn;
public static int nFil;
public static Semaphore mutex;
public static Filosofo[] filosofos;

public static void main(String[] args) {
maxComendo = comendo = 0;

nFil = Integer.parseInt(JOptionPane.showInputDialog(null, 
"Quantos filósofos vão jantar?", 
"Quantidade de filósofos", 
JOptionPane.QUESTION_MESSAGE));
System.out.println("Quantidade de filósofos: " + nFil);

JFrame mesa = new JFrame("Mesa de jantar");

mutex = new Semaphore(1);
filosofos = new Filosofo[nFil];

JPanel info = new JPanel();
info.add(new JLabel("Filósofos: " + nFil + "    "));
JLabel lblMaxtxt = new JLabel("Máximo Comendo: "); 
lblMaxn = new JLabel("0");
info.add(lblMaxtxt);
info.add(lblMaxn);
mesa.add(info, BorderLayout.NORTH);

popularMesa(mesa,filosofos);
mesa.setVisible(true);

for (int i = 0; i < filosofos.length; i++) {
   filosofos[i].start();
  }
 }

 private static void popularMesa(JFrame mesa, Filosofo[] filosofos) { 
  JPanel painel = new JPanel();
  painel.setLayout(
    new GridLayout(
      (int)Math.ceil(Math.sqrt(nFil)), 
      (int)Math.ceil(Math.sqrt(nFil))));
  
  for (int i = 0; i < nFil; i++) {
   System.out.println("Adicionando filósofo " + (i+1) + " à mesa.");
   filosofos[i] = new Filosofo();
   filosofos[i].setNumero(i);
   painel.add(filosofos[i].label);
  }
  
  mesa.add(painel);
  mesa.pack();
  mesa.setLocationRelativeTo(null);
  mesa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}


Classe Filósofo
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.concurrent.Semaphore;

import javax.swing.*;

public class Jantar {
public static int maxComendo, comendo;
public static JLabel lblMaxn;
public static int nFil;
public static Semaphore mutex;
public static Filosofo[] filosofos;

public static void main(String[] args) {
maxComendo = comendo = 0;

nFil = Integer.parseInt(JOptionPane.showInputDialog(null, 
"Quantos filósofos vão jantar?", 
"Quantidade de filósofos", 
JOptionPane.QUESTION_MESSAGE));
System.out.println("Quantidade de filósofos: " + nFil);

JFrame mesa = new JFrame("Mesa de jantar");

mutex = new Semaphore(1);
filosofos = new Filosofo[nFil];

JPanel info = new JPanel();
info.add(new JLabel("Filósofos: " + nFil + "    "));
JLabel lblMaxtxt = new JLabel("Máximo Comendo: "); 
lblMaxn = new JLabel("0");
info.add(lblMaxtxt);
info.add(lblMaxn);
mesa.add(info, BorderLayout.NORTH);

popularMesa(mesa,filosofos);
mesa.setVisible(true);

for (int i = 0; i < filosofos.length; i++) {
   filosofos[i].start();
  }
 }

 private static void popularMesa(JFrame mesa, Filosofo[] filosofos) { 
  JPanel painel = new JPanel();
  painel.setLayout(
    new GridLayout(
      (int)Math.ceil(Math.sqrt(nFil)), 
      (int)Math.ceil(Math.sqrt(nFil))));
  
  for (int i = 0; i < nFil; i++) {
   System.out.println("Adicionando filósofo " + (i+1) + " à mesa.");
   filosofos[i] = new Filosofo();
   filosofos[i].setNumero(i);
   painel.add(filosofos[i].label);
  }
  
  mesa.add(painel);
  mesa.pack();
  mesa.setLocationRelativeTo(null);
  mesa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}


Quer o programa pronto ou o código fonte?