我有一段代码在调用 notifyAll 时给出 IllegalMonitorException。在 enQueue() 时,线程添加数据并抛出非法监视器异常。
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;
}}
主类:
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();
}}
生产者类:
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();
}
}
}}
消费者类:
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");
}
}
}}
输出 :
添加 94
线程“生产者”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)