![]() | 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