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

时间:2011-07-05 15:39:59

标签: java concurrency operating-system

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

4 个答案:

答案 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)

我会使用SemaphoreCyclicBarrier或可能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只等待响应。如果响应已经到达,则不会等待。