2012-04-13 1 views
1

ich den folgenden Code geschrieben habe, aber ich glaube, ich werde irgendwo falsch:Erzeuger Verbraucher in Java

public class ProcessQueue { 

static BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 

public ProcessQueue() { 
    process(); 
} 

public void add(String message) throws InterruptedException { 
    System.out.println("Added Queue size:" + queue.size()); 
    System.out.println("Locked by Producer"); 
    queue.put(message); 
    System.out.println("Lock Released by Producer"); 
} 

public static void process() { 
    new Thread() { 

     @Override 
     public void run() { 
      try { 
       while (true) { 
        System.out.println("Locked by Consumer"); 
        Message.send(queue.take()); 
        System.out.println("Locked Released by Consumer"); 
        System.out.println("Consuming Queue size:" + queue.size()); 
       } 
      } catch (Exception ex) { 
       System.out.print(ex.getMessage()); 
      } 
     } 
    }.start(); 
} 
} 

hier hinzufügen (String) fügt die Zeichenfolge in der Warteschlange. Es wird immer dann aufgerufen, wenn es eine Eingabe von einem UDP-Port erhält. process() verarbeitet die Queue und sendet sie zur Verarbeitung an die Klasse Message. Die Ausgabe Gesperrt und Freigegebene Druckanweisungen ist nicht in der gewünschten Reihenfolge.

EDIT

sollte Meine erwartete Antwort sein: wenn es in Producer ist, die dann von Producer Gesperrt add -> Verschluss-Freigabe -> dann Warteschlange hinzufügen. Der gleiche Weg wäre beim Verbraucher. Die Operationen sollten jedoch nicht verschachtelt werden, d. H., Wenn der Drucker einmal vom Hersteller gesperrt wurde, sollte er nicht vom Verbraucher gesperrt gedruckt werden und dann Sperren freigeben.

+0

Was sind die erwarteten und tatsächlichen Bestellungen? – mfrankli

+0

was ist ihre gewünschte bestellung und in which bestellen sie drucken ?. – Shehzad

+0

@mfrangli bitte sehen Sie die EDIT-Sektion –

Antwort

3

Die einzige Zeitblockierung tritt hier auf, wenn die Warteschlange leer ist. Sonst werden Puts weiter passieren. Daher kann die Größe der Warteschlange nicht um eins erhöht werden. Möglicherweise möchten Sie die LinkedBlockingQueue anbinden. Fyi die LBQ ist standardmäßig unbegrenzt

bearbeiten basierend auf edit:

Meine Antwort so weit ist, zu erklären, was Sie sehen und warum. Sie suchen nach einer Warteschlange für synchrone Nachrichtenübermittlung. Sie können dies mit dem folgenden:

new SynchrnousQueue(); 
new LinkedBlockingQueue(1); 
new ArrayBlockingQueue(1); 
new TransferQueue(); 

SynchrnousQueue tut genau das, was Sie wollen. Die verknüpfte & ArrayBlockingQueue mit einer Grenze von 1 tut ziemlich genau das Gleiche. TransferQueue ist eine neue Warteschlange in Java 7, die transfer Methoden hat, die warten, bis ein Thread bereit ist, zu erwerben.

+0

bedeutet dies, dass der oben genannte Code für ein Producer Consumer Problem ist richtig? –

+1

Ja, für einen Single-Producer Single-Consumer –

+0

okay. das würde mein aktuelles Problem lösen. Was muss ich tun, damit es mit mehreren Herstellern oder Verbrauchern zusammenarbeitet? –