Back to lecture notes -- Keyboard shortcut: 'u'              Lecture 14 - slide 38 : 41
 

/* Synkroniseret koncert, hvor hver skjald synger på skift */

class Skjald extends Thread{
  
  private String[] strofer;
  int forsinkelse;      // pause efter et vers
  int gentagelser;      // hvor mange gange synger jeg verset
  int mig;              // mit nummer
  Dirigent coordinator; // reference til dirigenten

  public Skjald(int mig, Dirigent coordinator, String[] strofer, 
                int forsinkelse, int gentagelser){
    super();
    this.mig = mig;
    this.coordinator = coordinator;
    this.strofer = strofer;
    this.forsinkelse = forsinkelse;
    this.gentagelser = gentagelser;
  }

  // udskriver ét vers ad gangen:
  private void syngVers(){
    coordinator.tagScenen(mig);
    StringBuffer str = new StringBuffer(100);
    for(int i = 0; i < strofer.length; i++){
      str.append(strofer[i] + "\n");
    } 
    System.out.println(str.toString());
    try{
      if (forsinkelse > 0) Thread.sleep(forsinkelse);
    } 
    catch (InterruptedException e) 
      {};
    coordinator.frigivScenen();
  }

  public void run(){
    for(int g = 1; g <= gentagelser; g++){
        syngVers();
    }
    // jeg burde måske her give den anden lov til at synge færdig
  }
} // end class Skjald

class Dirigent{
  
  boolean scenenLedig;
  int næsteSanger;

  public Dirigent(int hvemStarter){
    scenenLedig = true; 
    næsteSanger = hvemStarter;
  }

  private int enAndenEnd(int i){
    if (i == 1) return(2);
    else if (i == 2) return(1);
    else return(0);
  }

  public synchronized void tagScenen(int hvemØnskerAtSynge){
   while (!scenenLedig || hvemØnskerAtSynge != næsteSanger){
    try {
      wait();
    } catch (InterruptedException e) { }
   } // end while
   // scenenLedig && hvemØnskerAtSynge == næsteSanger.
   scenenLedig = false;
   næsteSanger = enAndenEnd(hvemØnskerAtSynge);
  }

  public synchronized void frigivScenen(){
   scenenLedig = true;
   notifyAll();
  }

} // end class Dirigent    

class Sangkor3{

  static String[] mesterJakob = 
    {"MESTER JAKOB, MESTER JAKOB", "SOVER DU, SOVER DU", 
     "HØRER DU EJ KLOKKEN, HØRER DU EJ KLOKKEN", 
     "BIM BAM BUM, BIM BAM BUM"};

  static String[] gladeJul =
    {"Glade jul, dejlige jul", "Engle daler ned i skjul!",
      "Hid de flyver med paradisgrønt", "Hvor de ser, hvad for Gud er kønt", 
     "Lønligt iblandt os de går", "Lønligt iblandt os de går"};


  public static void main(String[] args){
    Dirigent jan_Glæsel = new Dirigent(2);
   
    // virker bedst når der er lige mange vers
    Skjald skjald1 = new Skjald(1, jan_Glæsel, mesterJakob, 1000, 2);
    Skjald skjald2 = new Skjald(2, jan_Glæsel, gladeJul, 200, 2);

    skjald1.start();
    skjald2.start();  
  }
} // end class Sangkor3