Melhor método para obter objetos de um BlockingQueue em um programa simultâneo?

StackOverflow https://stackoverflow.com/questions/23950

  •  09-06-2019
  •  | 
  •  

Pergunta

Qual é o melhor método para retirar objetos de um BlockingQueue, em um programa simultâneo, sem atingir uma condição de corrida?Atualmente estou fazendo o seguinte e não estou convencido de que seja o melhor método:

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
}

Ainda não atingi uma condição de corrida...mas não tenho certeza se isso é realmente seguro.

Foi útil?

Solução

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();
   }
 }

Este exemplo foi retirado do Documentos JDK 1.6 de BlockingQueue.Então você pode ver que está fazendo isso da maneira certa.Aqui está a citação que diz que tem que funcionar:

Efeitos de consistência de memória:Assim como outras coleções simultâneas, as ações em um thread antes de colocar um objeto em um BlockingQuee acontecerem antes de ações subsequentes ao acesso ou remoção desse elemento do BlockingQueue em outro thread.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top