正在从线程中运行的方法引发java.lang.IllegalMonitorStateException
我正在尝试使用以下方法创建基本的生产者/消费者类:正在从线程中运行的方法引发java.lang.IllegalMonitorStateException,java,Java,我正在尝试使用以下方法创建基本的生产者/消费者类: public class ProducerConsumer { private final static int MAX_SIZE = 100; private Queue<String> data = new PriorityQueue<>(); private Lock lock = new ReentrantLock(); private Condition bufferFull =
public class ProducerConsumer {
private final static int MAX_SIZE = 100;
private Queue<String> data = new PriorityQueue<>();
private Lock lock = new ReentrantLock();
private Condition bufferFull = lock.newCondition();
private Condition bufferEmpty = lock.newCondition();
public void produce(){
while(true) {
try {
lock.lock();
while (data.size() >= MAX_SIZE) {
bufferFull.await();
}
addData();
bufferEmpty.notifyAll();
} catch (InterruptedException e) {
System.out.println("error produce");
} finally {
lock.unlock();
}
}
}
public void consume(){
while(true) {
try {
lock.lock();
while (data.isEmpty()) {
bufferEmpty.await();
}
String value = data.poll();
System.out.println("Thread " + Thread.currentThread().getName() + " processing value " + value);
bufferFull.notifyAll();
} catch (InterruptedException e) {
System.out.println("error consume");
} finally {
lock.unlock();
}
}
}
private void addData(){
IntStream.range(0,10).forEach( i ->
data.add(new Date().toString())
);
}
public void start(int consumerNumber){
IntStream.range(0,consumerNumber)
.mapToObj(i -> new Thread(this::consume))
.collect(Collectors.toList())
.forEach(Thread::start);
Thread t = new Thread(this::produce);
t.start();
}
}
公共类生产者消费者{
私有最终静态int MAX_SIZE=100;
专用队列数据=新的优先级队列();
private Lock=new ReentrantLock();
private Condition bufferFull=lock.newCondition();
私有条件bufferEmpty=lock.newCondition();
公共产品{
while(true){
试一试{
lock.lock();
while(data.size()>=最大大小){
bufferFull.wait();
}
addData();
bufferEmpty.notifyAll();
}捕捉(中断异常e){
System.out.println(“错误生成”);
}最后{
lock.unlock();
}
}
}
公共消费(){
while(true){
试一试{
lock.lock();
while(data.isEmpty()){
bufferEmpty.await();
}
字符串值=data.poll();
System.out.println(“线程”+线程.currentThread().getName()+“处理值”+值);
bufferFull.notifyAll();
}捕捉(中断异常e){
System.out.println(“错误消耗”);
}最后{
lock.unlock();
}
}
}
私有void addData(){
IntStream.range(0,10).forEach(i->
data.add(新日期().toString())
);
}
公共无效开始(int consumerNumber){
IntStream.range(0,消费者编号)
.mapToObj(i->新线程(this::consume))
.collect(收集器.toList())
.forEach(线程::开始);
螺纹t=新螺纹(此::生产);
t、 start();
}
}
但是,它不断抛出错误:java.lang.IllegalMonitorStateException。我的问题是,为什么它会抛出这个错误?这个intance的方法是在线程中运行的,所以它们应该拥有条件锁,所以我不理解这个错误背后的含义
谢谢你的帮助
bufferEmpty.notifyAll()
是错误的调用方法。该方法要求您将监视器保持在“bufferEmpty”对象本身上,该对象与您正在使用的lock
实例无关
正确的调用方法是
bufferEmpty.signalAll();
是吗?“抛出表示线程试图在对象的监视器上等待,或通知在对象监视器上等待的其他线程而不拥有指定的监视器。”是的,但我不确定这是什么意思,own as thread locked the condition/lock?@AndyTurner根据我的锁定方式应该是正确的,但引发异常