Beste Methode, um Objekte aus einer BlockingQueue in einem gleichzeitigen Programm abzurufen?

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

  •  09-06-2019
  •  | 
  •  

Frage

Was ist die beste Methode, um in einem gleichzeitigen Programm Objekte aus einer BlockingQueue abzurufen, ohne auf eine Race-Bedingung zu stoßen?Ich mache derzeit Folgendes und bin nicht davon überzeugt, dass es die beste Methode ist:

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
}

Ich habe noch keine Rennbedingung erreicht ...Ich bin mir aber nicht sicher, ob das wirklich sicher ist.

War es hilfreich?

Lösung

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

Dieses Beispiel stammt aus dem JDK 1.6-Dokumente von BlockingQueue.So können Sie sehen, dass Sie es richtig machen.Hier ist das Zitat, das Ihnen sagt, dass es funktionieren muss:

Auswirkungen auf die Speicherkonsistenz:Wie bei anderen gleichzeitigen Sammlungen sind Aktionen in einem Thread vor dem Platzieren eines Objekts in einen Blockingqueue vor, bevor Aktionen nach dem Zugriff oder Entfernen dieses Elements aus dem Blockingqueue in einem anderen Thread zugänglich sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top