在Object.wait()之前调用Object.notify()

如果没有正在等待的线程,使用Object.wait() ,对Object.notify()Object.notifyAll()任何调用都不起作用。 我有一个场景,如果我在等待集为空时调用Object.notify() ,后续调用Object.wait()不应该让线程等待。 如何实现这一目标? 信号量可能是我能想到的一种解决方案。 有更优雅的解决方案吗?

这种情况似乎非常适合Semaphore 。 调用Semaphore.release()而不是notify()Semaphore.acquire()而不是wait。

使用标志来指示通知。 在进入等待之前读取标志并相应地采取行动。

 boolean stopped = false; public void run(){ synchronized(object){ while(!stopped) object.wait(); } } public void stop(){ synchronized(object){ stopped=true; object.notify(); } } 

我会使用SemaphoreCyclicBarrier或者可能是CountDownLatch – 哪个更适合你的真实场景。 我认为重用现有的抽象而不是自己使用低级机制是个好主意,除非这些机制准确地给出了你想要的行为(在这种情况下他们不会这样做)。

我这样实现了它

线程A:

  req.run(); synchronized (req) { try { req.wait(3000); rawResponse = eq.ReturnXML; logger.info("[" + refID + "] Response recieved: " + rawResponse); responseRecieved = true; req.notify(); } catch (InterruptedException ex) { logger.error("Error waiting on req", ex); } } 

线程B:

 synchronized (req) { while (!responseRecieved) { try { req.wait(3000); } catch (InterruptedException ex) { logger.error("Error waiting on req while trying to get state", ex); } } } 

线程A发出请求并等待响应,同时线程B只等待响应。 如果响应已经到达,则不会等待。