I took your posted code, made it into something that would execute and then modified it to use wait and notify:
First is your code with some dummy stuff:
// willemjav looping problem
public class WaitLoops {
boolean start;
Cont cont;
Waitloop wl;
//-----------------------------------------------------------
// Wait until start set
private void waitloop() {
wl = new Waitloop();
wl.start();
cont.setstartFlag(false);
// cont.selectonoff(true);
start=false;
System.out.println(">>waitloop - entering loop");
do { } while (!start); // wait for start button
System.out.println(">>waitloop - exited loop");
int trc = cont.gettrackNumb(); // read out the track number
mainSoundblock(trc);
} // end waitloop()
int cnt;
//-------------------------------------------------------------------------
// Wait until StartFlag set
class Waitloop extends Thread {
public Waitloop() {
cnt++; // the thread counter
System.out.println("count wait thread " + cnt); // to see what it is looping
}
public void run() {
cont.setstartFlag(false);
do { } while (!cont.getstartFlag()); // read the start button
start=true; // release waitloop looping
System.out.println("exited thread " + cnt);
}
}
class Cont {
boolean flag;
boolean esc;
int tn;
boolean getstartFlag(){return flag;}
void setstartFlag(boolean f){
flag = f;
System.out.println("set start flag " + flag);
}
int gettrackNumb() {return tn;}
void settrackNumb(int trck) {tn = trck;}
boolean getescFlag() {return esc;}
void setescFlag(boolean f) {esc = f;}
}
private void mainSoundblock(int trck) {
// cont.ed.resetFbo();
cont.setescFlag(false);
// trig=false;
// exit=false;
if (trck==1 && !cont.getescFlag()) {
Soundblock1();
cont.settrackNumb(trck);
trck=2;
}
if (trck==2 && !cont.getescFlag()) {
Soundblock2();
cont.settrackNumb(trck);
trck=3;
}
if (trck==3 && !cont.getescFlag()) {
Soundblock3();
cont.settrackNumb(trck);
trck=4;
}
if (trck==4 && !cont.getescFlag()) {
Soundblock4();
cont.settrackNumb(trck);
trck=5;
}
// ....... etc until 12
System.out.println(" end of sound block " );
cont.setescFlag(false);
// cont.ed.closeFbo1();
// cont.stopclk();
// cont.ed.resetFbo();
waitloop(); // NCR - RECURSIVE CALL???
} // end mainSoundBlock
void Soundblock1(){}
void Soundblock2(){}
void Soundblock3(){}
void Soundblock4(){}
// Constructor --------------------------------
public WaitLoops() {
cont = new Cont();
// Start a thread to set flag in 2 seconds
Thread t = new Thread(new Runnable() {
public void run() {
for(int i=0; i < 5; i++) {
try{Thread.sleep(2000);}catch(Exception x){}
cont.setstartFlag(true); // release Waitloop thread looping
} // end for(i)
System.exit(0); // EXIT - END OF TEST
}
});
t.start();
waitloop();
}
//--------------------------------------------------------------------
// Test the above
public static void main(String[] args) {
new WaitLoops();
}
} // end class
/*
Running: "C:\Program Files\Java\j2re1.4.2_08\bin\java.exe" -cp D:\JavaDevelopment\Testing\JavaForum\;D:\JavaDevelopment;. WaitLoops
count wait thread 1
set start flag false
>>waitloop - entering loop
set start flag false
set start flag true <<<<<<< After 2 sec sleep
exited thread 1
>>waitloop - exited loop
end of sound block
count wait thread 2
set start flag false
>>waitloop - entering loop
set start flag false
>>>>>>>>>>> HERE I C+A+D and ended task
0 error(s)
*/
Then modified to use wait / notify
// willemjav looping problem - Changed to use wait() and notifyAll()
public class WaitLoops2 {
Cont cont;
int cnt;
//-----------------------------------------------------------
// Wait until "user" presses start button (uses getstartFlag)
private void waitloop() {
while(true) { // do loop here vs a recursive call from mainSoundblock
cnt++;
Object mon = cont.setstartFlag(false); // be sure flag is off / get monitor
// cont.selectonoff(true);
System.out.println(">>waitloop - entering loop " + cnt);
while(!cont.getstartFlag()) {
synchronized(mon) {
try{mon.wait();}catch(Exception x){} // wait until button pressed
}
}
System.out.println(">>waitloop - exited loop " + cnt);
int trc = cont.gettrackNumb(); // read out the track number
mainSoundblock(trc);
}
} // end waitloop()
//----------------------------------------------------
// Dummy class for testing
class Cont {
boolean flag;
boolean esc;
int tn;
Object mon = new Object();
boolean getstartFlag(){
return flag;
}
Object setstartFlag(boolean f){
flag = f;
System.out.println("set start flag " + flag);
if(flag) { // when flag is set, release those waiting
synchronized(mon) {
mon.notifyAll(); // wakeup waiting thread
}
}
return mon; // return monitor so caller can wait() on it
}
int gettrackNumb() {return tn;}
void settrackNumb(int trck) {tn = trck;}
boolean getescFlag() {return esc;}
void setescFlag(boolean f) {esc = f;}
}
private void mainSoundblock(int trck) {
// cont.ed.resetFbo();
cont.setescFlag(false);
// trig=false;
// exit=false;
if (trck==1 && !cont.getescFlag()) {
Soundblock1();
cont.settrackNumb(trck);
trck=2;
}
if (trck==2 && !cont.getescFlag()) {
Soundblock2();
cont.settrackNumb(trck);
trck=3;
}
if (trck==3 && !cont.getescFlag()) {
Soundblock3();
cont.settrackNumb(trck);
trck=4;
}
if (trck==4 && !cont.getescFlag()) {
Soundblock4();
cont.settrackNumb(trck);
trck=5;
}
// ....... etc until 12
System.out.println(" end of sound block " );
cont.setescFlag(false);
// cont.ed.closeFbo1();
// cont.stopclk();
// cont.ed.resetFbo();
if(cnt == 4) { // debug to show recursive calls - NONE with this code
try{throw new Exception("Show Call Stack");}catch(Exception x){x.printStackTrace();}
/*
java.lang.Exception: Show Call Stack
at WaitLoops2.mainSoundblock(WaitLoops2.java:97)
at WaitLoops2.waitloop(WaitLoops2.java:23)
at WaitLoops2.<init>(WaitLoops2.java:123)
at WaitLoops2.main(WaitLoops2.java:129)
*/
}
} // end mainSoundBlock
// Dummy methods
void Soundblock1(){}
void Soundblock2(){}
void Soundblock3(){}
void Soundblock4(){}
// ...
// Constructor --------------------------------
public WaitLoops2() {
cont = new Cont();
// Start a thread to set flag in 2 seconds
// This is to simulate user pressing a button
Thread t = new Thread(new Runnable() {
public void run() {
for(int i=0; i < 5; i++) {
try{Thread.sleep(2000);}catch(Exception x){}
cont.setstartFlag(true); // press button
} // end for(i)
System.exit(0); // EXIT - END OF TEST
}
});
t.start();
waitloop(); // Start the program process
} // end Constructor
//--------------------------------------------------------------------
// Test the above
public static void main(String[] args) {
new WaitLoops2();
}
} // end class
/*
Running: "C:\Program Files\Java\j2re1.4.2_08\bin\java.exe" -cp D:\JavaDevelopment\Testing\JavaForum\;D:\JavaDevelopment;. WaitLoops2
set start flag false
>>waitloop - entering loop 1
set start flag true
>>waitloop - exited loop 1
end of sound block
set start flag false
>>waitloop - entering loop 2
set start flag true
>>waitloop - exited loop 2
end of sound block
set start flag false
>>waitloop - entering loop 3
set start flag true
>>waitloop - exited loop 3
end of sound block
set start flag false
>>waitloop - entering loop 4
set start flag true
>>waitloop - exited loop 4
end of sound block
java.lang.Exception: Show Call Stack
at WaitLoops2.mainSoundblock(WaitLoops2.java:97)
at WaitLoops2.waitloop(WaitLoops2.java:23)
at WaitLoops2.<init>(WaitLoops2.java:123)
at WaitLoops2.main(WaitLoops2.java:129)
set start flag false
>>waitloop - entering loop 5
set start flag true
>>waitloop - exited loop 5
end of sound block
set start flag false
>>waitloop - entering loop 6
0 error(s)
*/