這是我第一次在StackOverflow上提問。我遇到的問題如下:我有一個生產者和消費者類。在Producer類中,我逐行讀取一個文件,并將這些文本行放入字符串列表中。當列表中的行數為x時。此列表被添加到ArrayBlockingQueue。我有一個在主線程中啟動的生產者線程。除此之外,我還啟動了一些Consumer線程。消費者線程從隊列中獲取一個項目,該項目應該是一個列表,并遍歷此行列表以查找特定單詞。找到單詞后,它會增加一個計數變量。發生的事情是,當消費者從隊列中取出一個項目時,它說它是空的。我不知道為什么,因為我的制作人當然應該將其添加到隊列中。我的代碼如下所示:消費類:public static class Consumer implements Callable<Integer> { int count = 0; @Override public Integer call() throws Exception { List<String> list = new ArrayList<>(); list = arrayBlockingQueueInput.take(); do { if (!list.isEmpty()){ for (int i = 0; i < arrayBlockingQueueInput.take().size(); i++) { for (String element : list.get(i).split(" ")) { if (element.equalsIgnoreCase(findWord)) { count++; } } } } else { arrayBlockingQueueInput.put(list); } } while (list.get(0) != "HALT"); return count; }}誰能解釋為什么會這樣?我想補充一點,我們嘗試使用毒藥來告知消費者生產者處于暫停狀態。要回答我們為什么要這樣做的問題?對于學校,我們嘗試并行處理某個編程問題。我們選擇的問題是字符串匹配。我們首先提出了串行解決方案和并行解決方案。對于下一個作業,我們必須改進并行解決方案,而老師告訴我們,這是一種實現方法。
1 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
您將列表添加到隊列中并清除它:
arrayBlockingQueueInput.put(results); results.clear();
您需要執行以下操作將列表副本添加到隊列中,以免clear()
清理隊列中的列表:
arrayBlockingQueueInput.put(new ArrayList<String>(results)); results.clear();
添加回答
舉報
0/150
提交
取消