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)
Look at the java.lang.Object documentation - find the notifyAll
method. Read why notifyAll may throw an IllegalMonitorStateException.
You are not calling notify() on the same object on which you're calling
wait().
wait() and notify()/notifyAll() must operate on an object on which the
current thread already owns the monitor... IE, from within a synchronized
block.
Let's see if I can cobble something up that matches your specification:
import java.util.*;
class Data
{
public static final Data INSTANCE = new Data();
private List elements = new LinkedList();
public synchronized boolean hasData()
{
return !elements.isEmpty();
}
public synchronized void putData(String s)
{
elements.add(s);
}
public synchronized String getData()
{
String s = (String)elements.get(0);
elements.remove(s);
return s;
}
}
class Sender implements Runnable
{
public void run()
{
int count = 0;
while(true)
{
synchronized(Data.INSTANCE)
{
while(Data.INSTANCE.hasData())
{
try
{
Data.INSTANCE.wait();
}
catch(InterruptedException e)
{
}
}
Data.INSTANCE.putData("String " + count);
Data.INSTANCE.notifyAll();
}
count++;
}
}
}
class Receiver implements Runnable
{
public void run()
{
while(true)
{
String s = null;
synchronized(Data.INSTANCE)
{
while(!Data.INSTANCE.hasData())
{
try
{
Data.INSTANCE.wait();
}
catch(InterruptedException e)
{
}
}
s = Data.INSTANCE.getData();
Data.INSTANCE.notifyAll();
}
System.out.println(s);
}
}
}
public class TestHarness
{
public static void main(String[] args)
{
new Thread(new Receiver()).start();
new Thread(new Sender()).start();
}
}
>notifyAll();
you can't do a notifyAll without having a lock on the object first.
See http://mindprod.com/jgloss/thread.html
--
Canadian Mind Products, Roedy Green.
Coaching, problem solving, economical contract programming.
See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.