2016-11-20 7 views
1

Ich habe einen Code, den ich versuche, es auszuführen, die eine nicht ausgegebene Ausgabe gibt.Unerwartete Ausgabe in Consumer Producer Fehler

Code:

import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class ProducerConsumerBlockingQueue { 

    public static void main(String[] args) { 
     Buffer buffer = new Buffer(); 

     ExecutorService executor = Executors.newFixedThreadPool(2); 
     executor.execute(new ProdBlock(buffer)); 
     executor.execute(new ConsBlock(buffer)); 
     executor.shutdown(); 
    } 

} 
class ProdBlock implements Runnable{ 

    Buffer buffer; 
    public ProdBlock(Buffer buffer) { 
     this.buffer = buffer; 
    } 

    public void run() { 
     for(int i = 1; i <= 10; i++){ 
      buffer.put(i); 
     } 

    } 

} 
class ConsBlock implements Runnable{ 

    Buffer buffer; 
    ConsBlock(Buffer buffer){ 
     this.buffer = buffer; 
    } 
    public void run() { 
     for(int i = 1; i <= 10; i++){ 
      buffer.get(); 
     }  
    } 

} 
class Buffer{ 
    int i; 
    BlockingQueue<Integer> sharedObject = new ArrayBlockingQueue<Integer>(1); 

    public void get(){ 
     try { 
      System.out.println("Getting - " + sharedObject.take()); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    public void put(int i){ 
     this.i = i; 
     try { 
      sharedObject.put(i); 
      System.out.println("Putting - " + i); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ausgang:

Putting - 1 
Putting - 2 
Getting - 1 
Putting - 3 
Getting - 2 
Getting - 3 
Putting - 4 
Putting - 5 
Getting - 4 
Getting - 5 
Putting - 6 
Getting - 6 
Putting - 7 
Putting - 8 
Getting - 7 
Getting - 8 
Putting - 9 
Putting - 10 
Getting - 9 
Getting - 10 

Expectd Ausgang:

Putting - 1 
Getting - 1 
Putting - 2 
Getting - 2 
Putting - 3 
Getting - 3 
Putting - 4 
Getting - 4 
Putting - 5 
Getting - 5 
Putting - 6 
Getting - 6 
Putting - 7 
Getting - 7 
Putting - 8 
Getting - 8 
Putting - 9 
Getting - 9 
Putting - 10 
Getting - 10 

Wie erwartet, Warteschlange blockieren sollte nur 1 Wert zu einer Zeit, wie es speichert mehrere Werte?

+0

Debug Code Schritt für Schritt – Lucky

Antwort

1

Es werden nicht mehrere Werte gespeichert. Es ist nur so, dass, sobald die Aufnahme() -Methode zurückgegeben hat, kann der Hersteller einen Wert in die Warteschlange hinzufügen und es vor der anderen Thread druckt den aufgenommenen Wert drucken:

  1. Produzent thread: rufen Sie setzen (1) - die Warteschlange hat 1 Element
  2. Produzenten thread: print "Putting-1" - die Warteschlange hat 1 Element
  3. Verbraucher thread: Anruf annehmen() - die Warteschlange leer
  4. Producer-Thread: call setzen (2) - die Warteschlange 1 Element
  5. Producer-Thread: Drucken "Putting 2" - die Warteschlange hat 1 Element
  6. Verbraucher Thema: die Zeichenfolge „Getting -“ verketten mit der ganzen Zahl 1 erhalten in Schritt 3 und Drucken des Ergebnis - die Warteschlange hat 1 Element
+0

Was verstehen Sie unter „Druck bedeuten bevor der andere Thread den aufgenommenen Wert ausgibt "? Ich bekomme den Wert über 'take()' Methode. Wie bekomme ich den Wert vor dem Drucken? – Rohan

+0

Siehe meine bearbeitete Antwort. –

+0

Danke für die Erklärung. Ich habe dich verstanden. Ist es in diesem Fall nicht möglich, die richtige Reihenfolge des Problems zu drucken? – Rohan

Verwandte Themen