![]() Ласло Краус |
Објектно програмирање 2 - колоквијуми Други колоквијум 11. 1. 2011 |
|---|
Саставити на језику Java следећи пакет класа:
TextArea, која може да се дохвати. За сваког водича се наводи један ред са идентификатором водича и бројем планинара који чекају на њега.
Label, која може да се дохвати. Приказује се идентификатор водича, смер кретања и број планинара које води са собом. Водич може да се уништи.

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