вызов Object.notify () перед Object.wait () - PullRequest
5 голосов
/ 05 июля 2011

Если нет потока, который ожидает, используя Object.wait(), любые вызовы Object.notify() или Object.notifyAll() не имеют никакого эффекта.У меня есть сценарий, в котором, если я вызываю Object.notify(), когда набор ожидания пуст, последующий вызов Object.wait() не должен заставлять поток ждать.Как это можно сделать?Семафоры могут быть одним решением, о котором я могу думать.Есть ли более элегантное решение?

Ответы [ 4 ]

7 голосов
/ 05 июля 2011

Этот вид сценария идеально подходит для Semaphore.Звоните Semaphore.release() вместо notify() и Semaphore.acquire() вместо ожидания.

7 голосов
/ 05 июля 2011

Используйте флаг для обозначения уведомления. Прочитайте флаг, прежде чем войти в ожидание, и действуйте соответственно.

boolean stopped = false;

public void run(){
   synchronized(object){
      while(!stopped)
        object.wait();
   }

}

public void stop(){
  synchronized(object){
    stopped=true;
    object.notify();
  }

}
4 голосов
/ 05 июля 2011

Я бы использовал Semaphore, CyclicBarrier или, возможно, CountDownLatch - в зависимости от того, что лучше подходит для вашего реального сценария.Я думаю, что будет хорошей идеей повторно использовать существующие абстракции, а не использовать механизмы низкого уровня самостоятельно, если только эти механизмы не дают вам именно того поведения, которого вы хотите (чего в данном случае нет).

0 голосов
/ 09 января 2014

Я реализовал это следующим образом

Тема 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 только ждет ответа.Если ответ уже поступил, он не ждет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...