I am still learning on Threads following java tutorials of oracle website.
With regarding to the wait() and notifyAll(), I have written some code. My expected output is print the message in run() 10 times and print the "Fun stopped by StopFun Thread" message in guardedJoy(GuardedBlock guardedBlock)
method when the 'joy' set to false in the run method.
This is my code.
public class GuardedBlock {
private boolean joy = true;
public synchronized void guardedJoy(GuardedBlock guardedBlock) {
System.out.println(Thread.currentThread().getName() + " Guard Joy method started");
while (guardedBlock.joy) {
try {
System.out.println(Thread.currentThread().getName() + " Going to waiting state");
guardedBlock.wait();
} catch (InterruptedException ex) {
}
}
System.out.println("Fun stopped by StopFun Thread");
}
private static class StopFun implements Runnable {
private GuardedBlock guardedBlock;
public StopFun(GuardedBlock guardedBlock) {
this.guardedBlock = guardedBlock;
}
@Override
public void run() {
for (int x = 0; x < 100; x++) {
try {
Thread.sleep(500);
System.out.println("Allowing fun since its only " + x + " times - " + Thread.currentThread().getName());
if (x == 10) {
guardedBlock.joy = false;
guardedBlock.notifyAll();
break;
}
} catch (InterruptedException ex) {
}
}
}
}
public static void main(String[] args) {
GuardedBlock guardedBlock = new GuardedBlock();
StopFun sf = new StopFun(guardedBlock);
Thread stopFun = new Thread(sf);
stopFun.start();
guardedBlock.guardedJoy(guardedBlock);
}
}
The code in the run method runs fine but afterwards it throws an exception like this.
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at Synchronization.GuardedBlock$StopFun.run(GuardedBlock.java:38)
at java.lang.Thread.run(Thread.java:748)
I went through couple of questions and answers in the site like this and this but could not figure out what exactly I am doing wrong. A help is much valued.
Thanks.