为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在将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 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信