import java.util.LinkedList; import java.util.Queue; class Producer extends PubSub implements Runnable{ @Override public void run() { synchronized(queue){ if (queue.size() == 99){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } queue.add(2); try{ Thread.sleep(1000); } catch (InterruptedException e){ e.printStackTrace(); } notify(); } } } class Consumer extends PubSub implements Runnable{ @Override public void run() { synchronized(queue){ if(queue.isEmpty()){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(queue.poll()); } } } public class PubSub { static Integer QUEUE_SIZE = 100; Queue<Integer> queue = new LinkedList<Integer>(); public static void main(String[] args) { Producer producer = new Producer(); Consumer consumer = new Consumer(); Thread producerThread = new Thread(producer); Thread consumerThread = new Thread(consumer); producerThread.start(); consumerThread.start(); System.out.println("Started both the threads"); } }
我在wait()部分得到java.lang.IllegalMonitorStateException.我想知道我在这里做错了什么.有任何想法吗??
我得到的完整例外情况如下.
Exception in thread "Thread-1" Started both the threads java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:502) at Consumer.run(PubSub.java:36) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at Producer.run(PubSub.java:23) at java.lang.Thread.run(Thread.java:745)
解决方法
我认为我的代码工作正常…
如JB Nizet所述,您必须在队列对象上调用wait和notify.
我认为必须将此类对象声明为静态以供Producer和Consumer共享.
我已经包含while循环,代码继续运行直到时间结束.
此外,在Producer和Consumer首次等待之前需要额外通知
以下是包含以下更改的代码:
import java.util.LinkedList; import java.util.Queue; class Producer extends PubSub implements Runnable{ @Override public void run() { int index = 0; while (true) { synchronized(queue){ while (queue.size() == QUEUE_SIZE){ try { System.out.println("Producer waits"); queue.notify(); queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Produce element " + (++index)); queue.add(2); queue.notify(); try { Thread.sleep(1000); } catch (InterruptedException e){ e.printStackTrace(); } } } } } class Consumer extends PubSub implements Runnable{ @Override public void run() { while (true) { synchronized(queue) { while (queue.isEmpty()){ try { System.out.println("Consumer waits"); queue.notify(); queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Consume element " + queue.poll()); queue.notify(); } } } } public class PubSub { static Integer QUEUE_SIZE = 100; static Queue<Integer> queue = new LinkedList<Integer>(); public static void main(String[] args) { Producer producer = new Producer(); Consumer consumer = new Consumer(); Thread producerThread = new Thread(producer); Thread consumerThread = new Thread(consumer); producerThread.start(); consumerThread.start(); System.out.println("Started both the threads"); } }