IllegalMonitorStateException: current thread not owner

R

Riaz Uddin Ahmed

I've given the source code and the corresponding error generated by
JVM. Idea behind the program is there will be few Threads running
which will check a global data area whether has any data or not. If no
data is there, one of the Threads will put data and will notify all.
Otherwise the Thread will wait. Except these Thread, there will be
another thread which will check has data in global area or not. The
Thread will wait if has no data otherwise it will do something. I
tried my best to solve this situation. Please check my code & error
report and let me know

Thanks in advance.....

<<Code>>
public class Sender extends Thread
{
static String data = "";
static int machineId;

public static void main(String[] args)
{
SenderChild sc1 = new SenderChild(1);
Thread s1 = new Thread(sc1);
s1.start();
Sender sender = new Sender();
sender.start();
}
public void run()
{
while(true)
{
if( Sender.hasData() )
{
Sender.putData("");
notifyAll();
}
else
{
try
{wait(); }
catch(InterruptedException ie){}
}
}
}
static synchronized boolean hasData()
{
if(data == null || data.length() == 0)
return false;
return true;
}
static synchronized void putData(String data)
{
Sender.data = data;
}
static synchronized void machineNo(int id)
{
Sender.machineId = id;
}
}
class SenderChild implements Runnable
{
int i;
int index = 0;
public SenderChild(int id)
{
i = id;
}
public void run()
{
while(true)
{
System.out.println(""+i);
if(Sender.hasData())
{
try{wait();}
catch(InterruptedException ie)
{
}
}
else
{
Sender.putData("From machine no:- "+i+" for "+index+" times");
Sender.machineNo(i);
notifyAll();
}}}}




<<Error report>>
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notifyAll(Native Method)
at SenderChild.run(Sender.java:101)
at java.lang.Thread.run(Thread.java:536)
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notifyAll(Native Method)
at Sender.run(Sender.java:35)
 
D

David Zimmerman

You need to be synchronized on the object on which you're calling wait()
or notify().

You are not calling notify() on the same object on which you're calling
wait().
 
W

William Brogden

Riaz Uddin Ahmed said:
I've given the source code and the corresponding error generated by
JVM. Idea behind the program is there will be few Threads running
which will check a global data area whether has any data or not. If no
data is there, one of the Threads will put data and will notify all.
Otherwise the Thread will wait. Except these Thread, there will be
another thread which will check has data in global area or not. The
Thread will wait if has no data otherwise it will do something. I
tried my best to solve this situation. Please check my code & error
report and let me know

Look at the java.lang.Object documentation - find the notifyAll
method. Read why notifyAll may throw an IllegalMonitorStateException.


Thanks in advance.....

<<Code>>
public class Sender extends Thread
{
static String data = "";
static int machineId;

public static void main(String[] args)
{
SenderChild sc1 = new SenderChild(1);
Thread s1 = new Thread(sc1);
s1.start();
Sender sender = new Sender();
sender.start();
}
public void run()
{
while(true)
{
if( Sender.hasData() )
{
Sender.putData("");
notifyAll();
}
else
{
try
{wait(); }
catch(InterruptedException ie){}
}
}
}
static synchronized boolean hasData()
{
if(data == null || data.length() == 0)
return false;
return true;
}
static synchronized void putData(String data)
{
Sender.data = data;
}
static synchronized void machineNo(int id)
{
Sender.machineId = id;
}
}
class SenderChild implements Runnable
{
int i;
int index = 0;
public SenderChild(int id)
{
i = id;
}
public void run()
{
while(true)
{
System.out.println(""+i);
if(Sender.hasData())
{
try{wait();}
catch(InterruptedException ie)
{
}
}
else
{
Sender.putData("From machine no:- "+i+" for "+index+" times");
Sender.machineNo(i);
notifyAll();
}}}}




<<Error report>>
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notifyAll(Native Method)
at SenderChild.run(Sender.java:101)
at java.lang.Thread.run(Thread.java:536)
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notifyAll(Native Method)
at Sender.run(Sender.java:35)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top