[英]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.