Meilleure méthode pour obtenir des objets d'un BlockingQueue dans un programme simultané ?

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

  •  09-06-2019
  •  | 
  •  

Question

Quelle est la meilleure méthode pour extraire des objets d'une BlockingQueue, dans un programme concurrent, sans rencontrer de condition de concurrence critique ?Je fais actuellement ce qui suit et je ne suis pas convaincu que ce soit la meilleure méthode :

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
}

Je n'ai pas encore atteint de condition de concurrence...mais je ne suis pas sûr que ce soit vraiment sûr.

Était-ce utile?

La solution

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

Cet exemple est tiré du Documentation JDK 1.6 de BlockingQueue.Vous pouvez donc voir que vous le faites de la bonne manière.Voici la citation qui vous dit que cela doit fonctionner :

Effets de cohérence de la mémoire :Comme avec d'autres collections simultanées, les actions dans un fil avant de placer un objet dans un blockingQueue se produisent avant l'accès ou la suppression de cet élément de la BlockingQueue dans un autre fil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top