![]() Ласло Краус |
Објектно програмирање 2 - колоквијуми Други колоквијум 25. 1. 2012 |
|---|
Написати на језику Java следећи пакет класа:
/сума.
TextArea.
Label. У току евентуалног чекања на приспеће паре у банку, приказ треба да је црвене боје, иначе црне.

ispitx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.Z:
// 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(); }
}
(садржај)
Copyright © 2012, Laslo Kraus
Последња ревизија: 24.11.2012.