2008-08-23 16 views
4

Quelle est la meilleure méthode pour extraire des objets d'un BlockingQueue, dans un programme concurrent, sans atteindre une condition de concurrence? Je fais actuellement ce qui suit et je ne suis pas convaincu qu'il est la meilleure méthode:Meilleure méthode pour obtenir des objets à partir d'un BlockingQueue dans un programme concurrent?

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 touché une condition de course ... mais je ne suis pas trop sûr que ce soit vraiment sûr .

Répondre

6
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 provient du JDK 1.6 docs of BlockingQueue. Donc, vous pouvez voir que vous le faites de la bonne façon. Voici la citation qui vous indique qu'il faut travailler:

effets de cohérence de la mémoire: Comme autres collections concurrentes, les actions dans un fil avant de placer un objet en arriver, avant BlockingQueue actions après l'accès ou la suppression de cet élément de la BlockingQueue dans un autre thread.