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

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

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

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


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


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

// Klijent.java

package banka;

public class Klijent {
  private static int posid = 0;
  private int id = ++posid;
  private double suma = 5000*(2*Math.random()-1);

  public double suma() { return suma; }

  public String toString() { return String.format("%d/%.2f", id, suma); }
}

// Ulaz.java

package banka;
import java.awt.TextArea;

public class Ulaz extends Thread {
  private long tsr;
  private volatile boolean otv = false;
  private TextArea prikaz;

  public Ulaz(long ts, TextArea prik) { tsr = ts; prikaz = prik; start();}

  public void run() {
    try {
      while (!interrupted()) {
        synchronized (this) { if (!otv) wait(); }
        sleep((long)((0.8+0.4*Math.random())*tsr));
        stavi(new Klijent());
      }
    } catch (InterruptedException g) {}
  }

  public synchronized void otvori() { otv = true; notify(); }

  public void zatvori() { otv = false; }

  public void unisti() { interrupt(); }

  private static class Elem {
    Klijent kli; Elem sled = null;
    Elem(Klijent k) { kli = k; }
  }

  private Elem prvi = null, posl = null;

  private synchronized void stavi(Klijent k) {
    Elem novi = new Elem(k);
    if (prvi == null) prvi = novi; else posl.sled = novi;
    posl = novi; prikazi(); notifyAll();
  }

  public synchronized Klijent uzmi() throws InterruptedException {
    while (prvi == null) wait();
    Klijent k = prvi.kli;
    prvi = prvi.sled;
    if (prvi == null) posl = null;
    prikazi(); return k;
  }

  public synchronized String toString() {
    StringBuilder s = new StringBuilder();
    for (Elem tek=prvi; tek!=null; tek=tek.sled)s.append(tek.kli).append("\n");
    return s.toString();
  }

  private void prikazi() { prikaz.setText(toString()); }
}

// Salter.java

package banka;
import java.awt.*;

public class Salter extends Thread {
  private static int posId = 0;
  private int id = ++posId;
  private Banka banka;
  private long tsr;
  private Label prikaz;
  private Klijent kli = null;

  public Salter(Banka b, long ts, Label prik) {
    banka = b; tsr = ts; prikaz = prik;
    prikazi(); start();
  }

  public void run() {
    try {
      while (!interrupted()) {
        kli = banka.ulaz().uzmi(); prikazi();
        sleep((long)((0.8 + 0.4 * Math.random()) * tsr));
        prikaz.setForeground(Color.RED);
        banka.uplati(kli.suma());
        prikaz.setForeground(Color.BLACK);
        kli = null; prikazi();
      }
    } catch (InterruptedException g) {}
  }

  public void unisti() { interrupt(); }

  public String toString() {
    String s = "Salt:" + id;
    if (kli != null) s += "(" + kli + ")";
    return s;
  }
  private void prikazi() { prikaz.setText(toString()); }
}

// Banka.java

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

public class Banka extends Frame {
  private static final int TUL = 100, NSAL = 4, TSAL = 400;
  private static final String SUMA = "100000";
  private double stanje;
  private Ulaz ulaz;
  private Salter[] salt = new Salter [NSAL];
  private Checkbox potRadi = new Checkbox("Radi");
  private TextField tksStanje = new TextField(SUMA, 7);

  private Banka() {
    super("Banka"); setSize(250, 200);
    setResizable(false); sastavi();
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent d) {
        ulaz.unisti();
        for (Salter s: salt) s.unisti();
        dispose();
      }
    });
  }

  private void sastavi() {
    Panel plo = new Panel(); add (plo, "North");
    plo.add(potRadi);
    potRadi.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent d) {
        if (potRadi.getState()) {
          tksStanje.setEditable(false);
          stanje = Double.parseDouble(tksStanje.getText());
          ulaz.otvori();
        } else {
          tksStanje.setEditable(true);
          ulaz.zatvori();
        }
      }
    });
    plo.add(new Label("Stanje:", Label.RIGHT));
    plo.add(tksStanje);
    TextArea tks = new TextArea(1,12);
    tks.setEditable(false);
    add(tks, "West");
    plo = new Panel(new GridLayout(0, 1));
    add(plo, "Center");
    ulaz = new Ulaz(TUL, tks);
    for (int i=0; i<NSAL; i++) {
      Label ntp = new Label(); plo. add(ntp);
      salt[i] = new Salter(this, TSAL, ntp);
    }
    setVisible(true);
  }

  public Ulaz ulaz() { return ulaz; }

  public synchronized void uplati(double suma) throws InterruptedException {
    while (stanje+suma < 0) wait();
    stanje += suma; prikazi(); notifyAll();
  }

  private void prikazi() { tksStanje.setText(String.format("%.2f",stanje)); }

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

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