![]() Ласло Краус |
Објектно програмирање 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.