// Elem1.java - Klasa za elemente jednostruko lancanih listi.
class Elem1 {
Object obj; Elem1 nar;
public Elem1 (Object oo) { obj = oo; nar = null; }
public Elem1 (Object oo, Elem1 nn) { obj = oo; nar = nn; }
}
// Red.java - Klasa za redove za cekanje.
class Red {
Elem1 prvi=null, posl=null;
public synchronized void stavi (Object oo) {
Elem1 novi = new Elem1 (oo);
if (posl == null) prvi = novi;
else posl.nar = novi;
posl = novi;
notifyAll ();
}
public synchronized Object uzmi () {
while (prvi == null)
try {
wait ();
} catch (InterruptedException g) {}
Object obj = prvi.obj;
if ((prvi = prvi.nar) == null) posl = null;
return obj;
}
}
// Radnik.java - Klasa radnika za obradu predmeta u skladistu.
class Radnik extends Thread {
private Red skladiste;
private Obrada obrada;
private boolean zauzet = false;
public Radnik (Red ss, Obrada oo) { skladiste = ss; obrada = oo; }
public boolean slobodan () { return ! zauzet; }
public void run () {
while (true) {
Object predmet = skladiste.uzmi ();
zauzet = true;
obrada.radi (this, predmet);
zauzet = false;
}
}
}
// Obrada.java - Apstraktna klasa za obradu predmeta u magacinu.
abstract class Obrada {
abstract void radi (Radnik radnik, Object predmet);
}
// Pogon.java - Primer program za obradu predmeta u skladistu.
class MojRadnik extends Radnik {
private String ime;
public MojRadnik (Red skladiste, Obrada obrada, String ime)
{ super (skladiste, obrada); this.ime = ime; }
public String toString () { return ime; }
}
class MojaObrada extends Obrada {
static public int maxPredmet=3;
private Red skladiste;
MojaObrada (Red ss) { skladiste = ss; }
public void radi (Radnik rr, Object pp) {
String predmet = (String) pp;
String ime = rr.toString ();
System.out.println (ime + " < " + predmet);
for (int i=0; i<(int)(Math.random()*maxPredmet); i++) {
predmet = ime + " > " + Math.random ();
skladiste.stavi (predmet);
System.out.println (predmet);
}
}
}
class Pogon {
static public void main (String[] argi) {
String[] imena = {"Marko", "Zoran", "Petar", "Jovan"};
Radnik[] radnici = new Radnik [imena.length];
Red skladiste = new Red ();
Obrada obrada = new MojaObrada (skladiste);
for (int i=0; i<radnici.length; i++) {
(radnici[i] = new MojRadnik (skladiste, obrada, imena[i])).start ();
}
skladiste.stavi ("Pocetni predmet");
for (boolean dalje=true; dalje; dalje = ! dalje) {
try { Thread.sleep (100); } catch (InterruptedException g) {}
for (int i=0; i<radnici.length; i++) {
dalje = dalje && radnici[i].slobodan ();
}
}
for (int i=0; i<radnici.length; radnici[i++].stop ());
}
}
Marko < Pocetni predmet
Marko > 0.6809309074884311
Marko > 0.9624183945797175
Zoran < Marko > 0.6809309074884311
Jovan < Marko > 0.9624183945797175
Jovan > 0.8557073132178835
Petar < Jovan > 0.8557073132178835
Petar > 0.6498172949981001
Petar > 0.6805539212715566
Marko < Petar > 0.6498172949981001
Zoran < Petar > 0.6805539212715566
Copyright © 1998, Laslo Kraus
Poslednja revizija: 13.6.1998.