簡體   English   中英

Java中的生產者消費者

[英]Producer Consumer 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();
}
}

這里add(String)將字符串添加到隊列中。 只要從UDP端口接收輸入,就會調用它。 process()處理隊列並將其發送到Message類。 輸出鎖定和已發布的打印語句未按所需順序排列。

編輯

我的預期答案應該是:如果它在生產者中是添加然后由生產者鎖定 - >然后添加到隊列 - >鎖定釋放。 同樣的方式將是消費者。 但是操作不應該交錯,即一旦被生產者鎖定,它就不應該被消費者鎖定然后釋放鎖定。

阻塞將在此處發生的唯一時間是在隊列為空時進行。 否則看跌將繼續發生。 因此,您可能會看到隊列的大小不會增加1。 您可能希望對LinkedBlockingQueue設置綁定。 因為LBQ默認無限制

根據您的修改進行修改:

到目前為止,我的答案是解釋你所看到的和為什么。 您正在尋找同步消息傳遞隊列。 您可以使用以下內容執行此操作:

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

SynchrnousQueue完全符合您的要求。 帶有1的界限的Linked&ArrayBlockingQueue也是如此。 TransferQueue是Java 7中提供的新隊列,其具有等待線程准備好獲取的transfer方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM