亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在將ArrayBlockingQueue放入列表后導致它為空隊列?

為什么在將ArrayBlockingQueue放入列表后導致它為空隊列?

一只名叫tom的貓 2021-04-06 21:18:03
這是我第一次在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();


查看完整回答
反對 回復 2021-04-14
  • 1 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號