Сведения о вопросе

LARVION

04:25, 3rd August, 2020

Теги

java   concurrency    

Лучший способ получить объекты из BlockingQueue в параллельной программе?

Просмотров: 387   Ответов: 1

Каков наилучший способ получить объекты из BlockingQueue в параллельной программе, не попадая в состояние гонки? В настоящее время я делаю следующее, И я не уверен, что это лучший метод:

BlockingQueue<Violation> vQueue;
/* 
in the constructor I pass in a BlockingQueue object 
full of violations that need to be processed - cut out for brevity
*/

Violation v;
while ( ( v = vQueue.poll(500, TimeUnit.MILLISECONDS) ) != null ) {
    // do stuff with the violation
}

Я еще не достиг состояния гонки... но я не слишком уверен, что это действительно безопасно.



  Сведения об ответе

fo_I_K

22:36, 21st August, 2020

class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
 }

 class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
 }

 class Setup {
   void main() {
     BlockingQueue q = new SomeQueueImplementation();
     Producer p = new Producer(q);
     Consumer c1 = new Consumer(q);
     Consumer c2 = new Consumer(q);
     new Thread(p).start();
     new Thread(c1).start();
     new Thread(c2).start();
   }
 }

Этот пример был взят из JDK 1.6 документов BlockingQueue . Так что вы можете видеть, что делаете это правильно. Вот цитата, которая говорит вам, что это должно работать:

Эффекты согласованности памяти: как с другие параллельные коллекции, действия в потоке перед размещением объекта в BlockingQueue произошло-перед действия, следующие за доступом или удаление этого элемента из системы BlockingQueue в другом потоке.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться