Consumer Producer with BlockingQueue
-
Hallo zusammen,
Ich möchte mehrere Verbraucher in ein BlockingQueue schreiben und mehrere Consumer aus dieser lesen lassen.
So hab ichs gemacht:
import java.util.concurrent.*; public class ConsumeAndProduce { public static void main(String args[]) { //Gemeinsame Resource für Producer und Consumer Threads BlockingQueue q = new ArrayBlockingQueue(20, true); int pn=5, cn=10; //Erzeugen der Producer Threads for(int i=0; i<pn; i++) (new Producer(q,i)).start(); //Erzeugen der Consumer Threads for(int i=0; i<cn; i++) (new Consumer(q,i)).start(); } } class Producer extends Thread { private final BlockingQueue q; private int id; private int nr; //Konsturktor: gemeinsame Queue und Thread id Producer(BlockingQueue q, int id) { this.q = q; this.id = id; nr = 0; } String produce() { return "p"+id+": " + nr++; } public void run() { while(true) { try { String s = produce(); System.out.println(s); q.put(s); } catch(Exception e) { e.printStackTrace(); } } } } class Consumer extends Thread { private final BlockingQueue q; private int id; //Konstruktor: gemeinsame Queue und Thread id Consumer(BlockingQueue q, int id) { this.q = q; } public void run() { while(true) { try { System.out.println("c"+id+": " + q.take()); } catch(Exception e) { e.printStackTrace(); } } } }
Über die Ausgabe wundere ich mich aber:
p0: 18 p0: 19 p0: 20 p1: 0 p2: 0 p3: 0 p4: 0 p0: 21 c0: p0: 0 p1: 1 c0: p0: 1 p2: 1 c0: p0: 2 p3: 1 c0: p0: 3 p4: 1 c0: p0: 4 p0: 22 c0: p0: 5 p1: 2 c0: p0: 6 p2: 2 c0: p0: 7 p3: 2 c0: p0: 8 p4: 2 c0: p0: 9 p0: 23 c0: p0: 10 p1: 3 c0: p0: 11 p2: 3 c0: p0: 12
Obwohl ich 10 ConsumerThreads starte, liest immer nur einer "c0" aus der Queue.
Wodurch kommt das?Danke für alle Antworten!!!
-
Es fehlt ein
this.id = id;
-