¿El mejor método para obtener objetos de BlockingQueue en un programa concurrente?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es el mejor método para sacar objetos de BlockingQueue, en un programa concurrente, sin alcanzar una condición de carrera?Actualmente estoy haciendo lo siguiente y no estoy convencido de que sea el mejor 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
}

Todavía tengo que alcanzar una condición de carrera...pero no estoy muy seguro de si esto es realmente seguro.

¿Fue útil?

Solución

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 ejemplo fue tomado del JDK 1.6 documentos de BlockingQueue.Para que puedas ver que lo estás haciendo de la manera correcta.Aquí está la cita que le dice que tiene que funcionar:

Efectos de la consistencia de la memoria:Al igual que con otras colecciones concurrentes, las acciones en un hilo antes de colocar un objeto en un bloqueo de bloqueo, antes de las acciones posteriores al acceso o la eliminación de ese elemento de la Bloquingqueue en otro hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top