如果没有正在等待的帖子,则使用Object.wait()
,对Object.notify()
或Object.notifyAll()
的任何调用均无效。我有一个场景,如果我在等待集为空时调用Object.notify()
,则后续调用Object.wait()
不应该让线程等待。如何实现这一目标?信号量可能是我能想到的一种解决方案。有更优雅的解决方案吗?
答案 0 :(得分:7)
使用标志来指示通知。在进入等待之前阅读标志并采取相应行动。
boolean stopped = false;
public void run(){
synchronized(object){
while(!stopped)
object.wait();
}
}
public void stop(){
synchronized(object){
stopped=true;
object.notify();
}
}
答案 1 :(得分:7)
这种情况似乎非常适合Semaphore
。请拨打Semaphore.release()
而不是notify()
和Semaphore.acquire()
,而不是等待。
答案 2 :(得分:4)
我会使用Semaphore
,CyclicBarrier
或可能CountDownLatch
- 哪个更适合您的真实场景。我认为重用现有的抽象而不是自己使用低级机制是个好主意,除非这些机制能够准确地给出你想要的行为(在这种情况下他们不会这样做)。
答案 3 :(得分:0)
我像这样实现了它
主题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只等待响应。如果响应已经到达,则不会等待。