在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(); } }
我会使用Semaphore
, CyclicBarrier
或者可能是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只等待响应。 如果响应已经到达,则不会等待。