Prethodna | Nadređena | Naredna

Niti u jeziku Java

Sadržaj


Klasa za elemente jednostruko lančanih listi

// 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; }
}

Klasa za redove za čekanje

// 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;
  }
}

Klasa radnika za obradu predmeta u skladištu

// 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;
    }
  }
}

Apstraktna klasa za obradu predmeta u skladištu

// Obrada.java - Apstraktna klasa za obradu predmeta u magacinu.
abstract class Obrada {
  abstract void radi (Radnik radnik, Object predmet);
}

Program za obradu predmeta u skladištu

// 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 ());
  }
}

Primer rezultata rada

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

Autor: Laslo Kraus
E-pošta: kraus@etf.rs

Copyright © 1998, Laslo Kraus
Poslednja revizija: 13.6.1998.