[JAVA] Algorytm pięciu filozofów - opis

0

Witam serdecznie. Mam napisać projekt który rozwiąże problem ucztujących filozofów sugerując się na poniższym kodzie który napisał jeden z naszych studentów (taka mała podpowiedź od wykładowcy), problem polega na tym że nie wiem co gdzie i jak się dzieje. Byłbym wdzięczny za opis do tego kodu. Wstawiam tylko część zawierającą rozwiązanie problemu ucztujących filozofów. A oto kod

class Filozof extends Thread{

  private static int z=1;
  private int nr;
  private Stol stolik;

  public Filozof(Stol s) {
    nr = z;
    z++;
    stolik = s;
  }

  public void run() {
    try {
      for(;;) {
        sleep(2000);
        if (stolik.wezPaleczke(nr)) {
          sleep(1000+(int)(Math.random()*5000));
          stolik.polozPaleczke(nr);
        }
      }
    }
    catch (InterruptedException e) { }
  }

}


class Stol {

  private Posilek fil;
  private int[] paleczka = new int[5]; // 1 - paleczka w uzyciu, 0 - dostepna
  private int[] je = new int[5];

  public Stol(Posilek r) {
    fil = r;
    for (int i=0;i<5;i++)
      paleczka[i]=0;
    for (int k=0;k<5;k++)
      je[k]=0;
  }


  public synchronized boolean wezPaleczke(int f) {
    if (paleczka[f-1]==0) {
      paleczka[f-1]=1;
      if (f==5) {
        if (paleczka[0]==1) {
          paleczka[f-1]=0;
          rysuj();
          return false;
        }
        else {
          paleczka[0]=1;
          je[f-1]=1;
          rysuj();
          return true;
        }
      }
      else {
        if (paleczka[f]==1) {
          paleczka[f-1]=0;
          rysuj();
          return false;
        }
        else {
          paleczka[f]=1;
          je[f-1]=1;
          rysuj();
          return true;
        }
      }
    }

    else return false;
  }

  public synchronized void polozPaleczke(int f) {
    if (f==5)
      paleczka[0]=0;
    else
      paleczka[f]=0;
    paleczka[f-1]=0;
    je[f-1]=0;
    rysuj();
  }

  public int[] p(){
    return paleczka;
  }

  public int[] j(){
    return je;
  }

  public  synchronized void rysuj() {
    fil.repaint();
  }
}

w pozostałych klasach jest graficzne rozwiązanie tego problemu odnoszącego się do tej klasy

0

A może by tak opisać zagadkę ucztujących filozofów?

0

zagadka tak znana że nie ma co opisywać

0

No pewnie - każdy ją zna.

0

Problem znany. Jeśli znasz choć w słabych podstawach Javę, to nie powinno to być dla Ciebie zbyt trudne, nawet ogólnie nazwy metod mówią co robią.

W całym kodzie chodzi o słówko kluczowe synchronized. Zobacz gdzie jest użyte i pomyśl co by było gdyby go tam zabrakło. Nawet możesz sobie wywalać na konsolę informację co się dzieje, potem usuń synchronized i zobacz jakie błędy program zacznie popełniać nagle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1