Java 检查是否有人在等待()/notify()中等待

Java 检查是否有人在等待()/notify()中等待,java,concurrency,Java,Concurrency,在调用notifyAll()之前,是否可以检查是否至少有一个线程正在等待 我排着队,厨师把菜放进去,而人们来拿菜。如果厨师把菜放在空的队列中,必须通知人们他们可以来(如果队列是空的并且他们想要得到一道菜,他们被设置为wait()) 所以这个方法从 public synchronized void put(String[] dishes){ if(dishesQueue.size() == 0){ notifyAll(); } (...) } 但现在的问题

在调用
notifyAll()
之前,是否可以检查是否至少有一个线程正在等待

我排着队,厨师把菜放进去,而人们来拿菜。如果厨师把菜放在空的队列中,必须通知人们他们可以来(如果队列是空的并且他们想要得到一道菜,他们被设置为
wait()

所以这个方法从

public synchronized void put(String[] dishes){
    if(dishesQueue.size() == 0){
        notifyAll();
    }
    (...)
}
但现在的问题是,当厨师第一次上菜时,队列是空的,但还没有人在等待,所以我得到了一个
java.lang.IllegalMonitorStateException
。是否有方法首先检查是否有线程等待,如果有,则检查notifyAll()?还是我第一次使用了一些“棘手”的布尔解决方案


此外,为了理解,即使只有厨师调用
put(…)
,该方法也必须是
同步的,因为它与dishesQueue一起运行,而dishesQueue也是由
get()
方法操作的,对吗?

不,您不应该因此而得到异常。您可以调用
notifyAll
,而不管是否有任何东西在等待。请显示一个演示问题的简短但完整的程序。只有在调用
notifyAll
而不拥有目标对象的监视器时,才会引发您报告的异常。代码示例中显然不是这样。其次,您可能没有充分的理由去摆弄笨拙的等待通知机制。您可以使用并发队列,它们只需要您调用它们的方法、不同步、不等待循环等。请检查等待线程的线程状态。