Producer Consumer的Java实现抛出java.lang.IllegalMonitorState
发布时间:2020-12-14 05:49:56 所属栏目:Java 来源:网络整理
导读: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.printStack
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. 我已经包含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");
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
