VISER, Beograd
Ласло Краус
Објектно програмирање 2 - колоквијуми
Други колоквијум
11. 1. 2011

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Саставити на језику Java следећи пакет класа:


Напомене (садржај)


Решење задатка (поставка | садржај)

// GPuno.java

package planinarenje;

public class GPuno extends Exception {
  public String toString() { return "*** Drustvo je puno!"; }
}

// Drustvo.java

package planinarenje;
import java.awt.*;

public class Drustvo extends Thread {
  int maxVod, brVod = 0, tSrl;
  private Vodic[] vodici;
  private int[] brPlan;
  private TextArea prikaz = new TextArea(1,10);
  private volatile boolean radi = false;

  public Drustvo(int mV, int tS) {
    maxVod = mV;
    tSrl = tS;
    vodici = new Vodic [mV];
    brPlan = new int [mV];
    start();
  }

  public Drustvo dodaj(Vodic v) throws GPuno {
    if (brVod == maxVod) throw new GPuno();
    vodici[brVod++] = v;
    return this;
  }

  public synchronized void otvori () { radi = true; notifyAll(); }

  public synchronized void zatvori() { radi = false; notifyAll(); }

  public void unisti() {
    for (Vodic v: vodici) v.unisti();
    interrupt();
  }

  public void run() { prikazi();
    try {
      while (!interrupted()) {
        while (!radi) synchronized (this) {
          for (int i=0; i<brVod; brPlan[i++]=0);
          prikazi();
          wait();
        }
        int dt = (int)((0.8 + Math.random() * 0.4) * tSrl);
        sleep (dt);
        stavi();
      }
    } catch (InterruptedException g) {}
  }

  private synchronized void stavi() {
    brPlan[(int)(Math.random() * brVod)]++;
    notifyAll();
    prikazi();
  }

  private void prikazi() {
    String s = "";
    for (int i=0; i<brVod; s+=(i+1)+": "+brPlan[i++]+"\n");
    prikaz.setText(s);
  }

  public TextArea dohvPrik() { return prikaz; }

  public synchronized int uzmiPlan(Vodic v) throws InterruptedException {
    int ind = v.dohvId() - 1;
    while (radi && brPlan[ind]==0) synchronized (this) { wait(); }
    int rez = 1;
    if (radi) brPlan[ind]--; else rez = 0;
    prikazi();
    notifyAll();
    return rez;
  }
}

// Vodic.java

package planinarenje;
import java.awt.Label;

public class Vodic extends Thread {
  private static int posId = 0;
  private int id = ++posId;
  private Drustvo dru;
  private int maxPlan, brPlan, tSr;
  private String smer;
  private Label prikaz = new Label();

  public Vodic(Drustvo d, int mP, int tS)
   { dru = d; tSr = tS; maxPlan = mP; start(); }

  public int dohvId() { return id; }

  public void unisti() { interrupt(); }

  public void run() {
    try {
      while (!interrupted()) {
        smer = ""; brPlan = 0; prikazi();
        int k = 1;
        while (brPlan<maxPlan && k==1) {
          brPlan += (k = dru.uzmiPlan(this));
          prikazi();
        }
        if (brPlan > 0) {
          smer = "==>"; prikazi();
          int dt = (int)((0.8 + Math.random() * 0.4) * tSr);
          sleep (dt);
          smer = "<=="; prikazi();
          dt = (int)((0.8 + Math.random() * 0.4) * tSr);
          sleep (dt);
        }
      }
    } catch (InterruptedException g) {}
  }

  private void prikazi() {
    String s = id + ": " + brPlan + " " + smer;
    prikaz.setText(s);
  }

  public Label dohvPrik() { return prikaz; }
}

// Program.java

package planinarenje;
import java.awt.*;
import java.awt.event.*;

public class Program extends Frame {
  private static final int brVod = 5, tDol = 500,
                           maxPlan = 5, tTura = 3000;
  private Drustvo dru = new Drustvo(brVod, tDol);

  private void popuniProzor() {
    Panel plo = new Panel(new GridLayout(1,2));
    add(plo, "Center"); plo.add(dru.dohvPrik());
    Panel p = new Panel(new GridLayout(0, 1));
    plo.add(p);
    try {
      for (int i=0; i<brVod; i++) {
        Vodic v = new Vodic(dru, maxPlan, tTura);
        dru.dodaj(v); p.add(v.dohvPrik());
      }
    } catch (GPuno g) {};
    add(plo = new Panel(), "South");
    plo.setBackground(Color.LIGHT_GRAY);
    Button dgm = new Button("Otvori"); plo.add(dgm);
    dgm.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent d)
        { dru.otvori(); }
    });
    plo.add(dgm = new Button("Zatvori"));
    dgm.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent d)
        { dru.zatvori(); }
    });
  }

  private Program () {
    super("Planinarenje"); setSize(200, 180);
    popuniProzor(); setVisible(true);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent d)
        { dru.unisti(); dispose(); }
    });
  }

  public static void main(String[] varg) { new Program(); }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2011, Laslo Kraus
Последња ревизија: 26.11.2011.