微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 生产者消费者 IllegalMonitorStateException

如何解决Java 生产者消费者 IllegalMonitorStateException

我使用 Java 线程构建了生产者-消费者。生产者和消费者是两个不同的类,分别指的是单链表和对象锁。下面的实现有什么问题?

   place   lat  long group_places
2      f  34.1   7.9           C 
4      g  39.2   9.8           A 
11     h  31.2   6.8           D 

代码实现

Item Produced by Thread-0 Item 1
Item Consumed by Thread-1 Item 1

    Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at ProducerConsumer$Producer.produce(ProducerConsumer.java:35)
        at ProducerConsumer$Producer.run(ProducerConsumer.java:19)
        at java.lang.Thread.run(Thread.java:745)
    java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at ProducerConsumer$Consumer.consume(ProducerConsumer.java:63)
        at ProducerConsumer$Consumer.run(ProducerConsumer.java:50)
        at java.lang.Thread.run(Thread.java:745)

解决方法

explicit

这是由于对 Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at ProducerConsumer$Producer.produce(ProducerConsumer.java:35) at ProducerConsumer$Producer.run(ProducerConsumer.java:19) at java.lang.Thread.run(Thread.java:745) java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at ProducerConsumer$Consumer.consume(ProducerConsumer.java:63) at ProducerConsumer$Consumer.run(ProducerConsumer.java:50) at java.lang.Thread.run(Thread.java:745) 方法的调用不遵守其 contract:

唤醒在此对象监视器上等待的单个线程。 (……) 这个方法只能被拥有者的线程调用 此对象的监视器。

同样适用于 notify(); 方法:

此方法只能由作为此对象监视器所有者的线程调用。

TL:DR

您在错误的上调用 waitwait隐式锁实例返回notify()).

分别将这些调用更改为:

thislock.notify();

基于提供的代码的运行示例:

lock.wait();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。