2011-08-16 4 views
0

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

  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 variable.The woud проверить эту переменную в цикле в то время как каждый раз.

    ProcessingThread:

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

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

+0

Будет ли каждый вызов веб-службы фиксированным числом новых строк в БД? Вы порождаете известное количество этих потоков? – Argote

+0

Каждый вызов веб-службы приведет к созданию некоторых строк в db, но числа могут меняться каждый раз. И это нить. – Oxford

+0

Почему вы спите ?? – toto2

ответ

0
@Override 
public void run() { 
    while (db.getNumLinesOfWantedType() >= wantedNum) { 
     webServiceFillDB(); 
    } 
    // The thread terminates here when the database has enough lines. 
} 

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

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

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

Смежные вопросы