这是我第一次在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
提交
取消