أفضل طريقة للحصول على كائنات من BlockingQueue في برنامج متزامن؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة لإخراج الكائنات من 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
}

لم أصل إلى حالة السباق بعد ...لكنني لست متأكدًا مما إذا كان هذا آمنًا حقًا.

هل كانت مفيدة؟

المحلول

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 في مؤشر ترابط آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top