Какой метод синхронизации следует использовать для приостановки потока очереди потребителя? - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть приложение Android с LinkedBlockingQueue, которое я использую для запуска серии сетевых заданий в отдельном потоке (назовите его сетевым потоком). Когда я получаю определенный ответ от сетевого задания, мне нужно приостановить задания для ввода данных пользователем из диалогового окна. Я хотел бы заблокировать сетевой поток, пока пользовательский ввод не будет завершен, а затем разблокировать его, чтобы он мог продолжать обрабатывать сетевые задания. Какой механизм параллелизма имеет здесь больше всего смысла?

EDIT: Поскольку приостановка выполняется на основе результатов сетевого задания, событие приостановки поступает из сетевого потока

1 Ответ

1 голос
/ 12 апреля 2011

Edit: Ваше редактирование делает разрешение немного проще. Вам все равно понадобится сигнализация, но вы можете поцарапать сложный беспорядок, который я вставил. Вы можете использовать простой ReentrantLock и флаг.

Может быть, как-то так

boolean needsToWaitForUserInput = false;
final ReentrantLock lock = new ReentrantLock();
final Condition waitingCondition = lock.newCondition();

private final Runnable networkRunnable=new Runnable(){ 
  public void run(){
      //get network information
      lock.lock();
      needsToWaitForUserInput  = true;
      try{      
         while(needsToWaitForUserInput ){
            waitingCondition.await();
         }
      }finally{ 
          lock.unlock();
      }
   }
}
    public void signalJobToContinue(){
      lock.lock();
      try{      
            needsToWaitForUserInput =false;
            waitingCondition.signal();
      }finally{ 
         lock.unlock(); 
      }

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