Petit aide mémoire pour l’implémentation du pattern producteur/consommateur en java.
1. Le producteur
2. Le consommateur
3. Exemple de lanceur
4. Source & notes
1. Le producteur
import java.util.concurrent.BlockingQueue ; public class Producteur implements Runnable { private final BlockingQueue sharedQueue; public Producteur(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { // la génération d'objet de type T sharedQueue.put(object); } }
2. Le consommateur
import java.util.concurrent.BlockingQueue ; public class Consommateur implements Runnable { private final BlockingQueue sharedQueue; public Consommateur(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { while (true) { try { T object = sharedQueue.take(); // l'utilisation de l'object reste a coder } catch (Exception e) { e.printStackTrace(); } } } }
3. Exemple de lanceur
public static void main(String args[]) { //Creating shared object BlockingQueue sharedQueue = new LinkedBlockingQueue(); //Creating Producer and Consumer Thread Thread prodThread = new Thread(new Producteur(sharedQueue)); Thread consThread = new Thread(new Consommateur(sharedQueue)); //Starting producer and Consumer thread prodThread.start(); consThread.start(); } }
4. Source & notes
Dans certains cas, le lanceur et le producteur sont fusionnés.
Dans ce cas :
- Le constructeur du producteur créée l’instance du consommateur, lui donne la sharedQueue en paramètre, et finit par appeler la méthode start() du consommateur.
- Le producteur n’implémente pas runnable, mais dispose quand même d’une fonction permettant d’ajouter des éléments à la sharedQueue .
- Le consommateur dispose en général d’une méthode d’arrêt, appelé par le lanceur.
Source :
http://javarevisited.blogspot.fr/2012/02/producer-consumer-design-pattern-with.html
Pour en savoir plus :
http://blog.paumard.org/cours/java-api/chap05-concurrent-queues.html