Завершение работы Java-потока с использованием условия завершения - PullRequest
0 голосов
/ 16 августа 2011

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

  1. Обработка нити:

        run() {
    
                while(not [db call to get row count] = expected number ) {
    
                   call web service
    
                   // wait for some time for the next call? not sure
                   // if this is the way to do it
                   Thread.sleep(200);   
                }
        }    
    
  2. Иметь внешний поток, отслеживающий состояние базы данных и обновляющий переменную AtomicBoolean. Поток обработки каждый раз проверяет эту переменную в цикле while.

    ProcessingThread:

    private Runnable dbStatusThread;
    run() {
    
       while(dbStatusThread.booleanValue == false) {
          call web service
    
              // wait for some time for the next call
          Thread.sleep(200);    
       }
    }
    

Я пытался реализовать второй вариант, но даже если для логического значения задано значение true, это не всегда отражается, и run () не всегда сразу завершается. Когда я пишу это, я читаю JCIP, но кто-нибудь знает стандартный способ сделать это? Спасибо.

1 Ответ

0 голосов
/ 16 августа 2011
@Override 
public void run() {
   while (db.getNumLinesOfWantedType() >= wantedNum) {
      webServiceFillDB();
   }
   // The thread terminates here when the database has enough lines.
}

Я поставил не == в условии, а >=, поскольку, возможно, вы получите больше строк, чем вы хотите.

Даже если какой-то другой процесс или поток заполняетсяВ базе данных одновременно этот код действителен.Если нет другого процесса, заполняющего базу данных, вы могли бы просто выполнить цикл for, вызывающий веб-службу определенное количество раз, без проверки базы данных на каждом шаге.

Обратите внимание, что база данных является своего рода "синхронизирован "для начала: при проверке количества строк в базе данных вы получите текущую картинку.

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