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)
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)