Though my question sound like stupid..
Here is code for multiple thread :
public class Main { private int x = -1; public Main(int xy) { this.setX(xy); } static Main main; public static void main(String[] args) { main = new Main(10); Runnable runnable = new Runnable() { @Override public void run() { synchronized (main) { System.out.println(Thread.currentThread().getName()); for (int i = 0; i < 5; i++) { main.setX(main.getX() + 10); if (main.getX() >= 40) { try { wait(); } catch (InterruptedException e) { } } System.out.println("X : " + main.getX()); } } } }; Thread one = new Thread(runnable); one.setName("Hi From One!!"); one.start(); Thread two = new Thread(runnable); two.setName("Hi From Two!!"); two.start(); } public int getX() { return x; } public void setX(int x) { this.x = x; } }
While executing this code I am getting following output:
Hi From Two!!<br> X : 20<br> X : 30<br> Exception in thread "Hi From Two!!" java.lang.IllegalMonitorStateException<br> at java.lang.Object.wait(Native Method)<br> at java.lang.Object.wait(Object.java:503)<br> at Main$1.run(Main.java:23)<br> at java.lang.Thread.run(Thread.java:722)<br> Hi From One!!<br> Exception in thread "Hi From One!!" java.lang.IllegalMonitorStateException<br> at java.lang.Object.wait(Native Method)<br> at java.lang.Object.wait(Object.java:503)<br> at Main$1.run(Main.java:23)<br> at java.lang.Thread.run(Thread.java:722)<br> I am not getting why it is throwing the IllegalMonitorStateException.
Here what I am trying to achieve is I want if value of X is grater than 40 same thread should wait and let other to execute.
Thanks, Yash