试图使用Java中的简单计数器练习生产者和消费者。 不知道为什么我在这段代码上收到非法的监视器状态异常。
我有在自己的线程中运行的计数器休息和计数器消耗方法。 计数器本身是一个静态的int volatile字段。 计数器类还可以锁定
如果我将等待导航更改为以下内容:
Counter.lock.notify();
Counter.lock.wait();
该代码有效。
>是否不等待wait()和notify()自动获取锁同步的引用?生产者类别
package multithreading;
public class CounterProducer implements Runnable {
public void run() {
try { incrCounter(); } catch (InterruptedException e) { e.printStackTrace(); }
}
public void incrCounter() throws InterruptedException {
while (true) {
synchronized (Counter.lock) {
if (Counter.counter < 1) {
System.out.println("Counter Reset");
Counter.counter = 10;
notify();
wait();
}
}
}
}
}
消费阶层
package multithreading;
public class CounterConsumer implements Runnable {
public void run() {
try { consumeCounter(); } catch (InterruptedException e) { e.printStackTrace(); }
}
public void consumeCounter() throws InterruptedException {
while (true) {
synchronized (Counter.lock) {
if (Counter.counter > 0) {
System.out.println("Consumed");
Counter.counter--;
notify();
wait();
}
}
}
}
}
The Counter
public class Counter {
public static volatile int counter;
public static final Object lock = new Object();
}
柜台
public class CounterRunner {
public static void main(String[] args) {
Thread con = new Thread(new CounterConsumer());
Thread prod = new Thread(new CounterProducer());
con.start();
prod.start();
}
}
跑步者
public class CounterRunner {
public static void main(String[] args) {
Thread con = new Thread(new CounterConsumer());
Thread prod = new Thread(new CounterProducer());
con.start();
prod.start();
}
}
答案 0 :(得分:2)
如果将wait naotify更改为以下内容,则代码将起作用:
Counter.lock.notify(); Counter.lock.wait();
每个Java方法都是某个类的静态方法或某个对象的实例方法。如果您看到一个不包含显式类名或对象引用的方法调用,则它是对属于this
对象的方法的隐式调用。
也就是说,notify()
的含义与this.notify()
相同,而wait()
的含义是this.wait()
。
this
,是指CounterProducer
实例出现在您的CounterProducer.incrCounter()
方法中,它是指CounterConsumer
实例,出现在您的{{1}中}方法。