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;
    


  • 😡 😡 😡 😡 😡 😡 😡 😡 😡 😡


Anmelden zum Antworten