I have a piece of code which is giving IllegalMonitorException while calling notifyAll. While enQueue(), thread add the data and throws illegalMonitorException.
BlockingQueue.class :
public class BlockingQueue {
private Queue<Integer> queue = new LinkedList<>();
private int maxCount;
private Lock lock = new ReentrantLock();
BlockingQueue(int maxCount){
this.maxCount=maxCount;
}
public void enQueue(int d) throws InterruptedException {
lock.lock();
if(queue.size() >= maxCount){
System.out.println("going to wait enqueu "+Thread.currentThread().getName() +" size "+queue.size());
lock.wait();
}
System.out.println(" Adding "+d);
queue.add(d);
lock.notify();
lock.unlock();
}
public Integer deQueue() throws InterruptedException {
lock.lock();
if(queue.size()==0){
System.out.println("going to wait dequeue "+Thread.currentThread().getName()+" size "+queue.size());
lock.wait();
}
int data = queue.remove();
lock.notify();
lock.unlock();
return data;
}}
Main.Class :
public class Main {
public static void main(String args[]){
BlockingQueue queue=new BlockingQueue(10);
Producer p = new Producer(queue);
Consumer c = new Consumer(queue);
Thread t1=new Thread(c,"Consumer");
Thread t2=new Thread(p, "producer");
t1.start();
t2.start();
}}
Producer.class :
public class Producer implements Runnable {
private BlockingQueue q;
Producer(BlockingQueue qu){
this.q=qu;
}
public Integer generateWork() throws InterruptedException {
return new Random().nextInt(100 );
}
@Override
public void run() {
for(int i =0; i<100; i++){
try {
Thread.sleep(100);
q.enQueue(generateWork());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
Consumer.class :
public class Consumer implements Runnable {
private BlockingQueue queue;
Consumer(BlockingQueue q){
this.queue=q;
}
public void consume(int data){
System.out.println(" consume "+data);
}
@Override
public void run() {
for(int i=0; i < 100; i++){
try {
Thread.sleep(1000);
consume(queue.deQueue());
} catch (InterruptedException e) {
System.out.println("interrupted");
}
}
}}
Output :
Adding 94
Exception in thread "producer" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at BlockingQueue.enQueue(BlockingQueue.java:23)
at Producer.run(Producer.java:20)
at java.lang.Thread.run(Thread.java:748)