猿问

为什么在将ArrayBlockingQueue放入列表后导致它为空队列?

这是我第一次在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;

    }

}

谁能解释为什么会这样?我想补充一点,我们尝试使用毒药来告知消费者生产者处于暂停状态。

要回答我们为什么要这样做的问题?对于学校,我们尝试并行处理某个编程问题。我们选择的问题是字符串匹配。我们首先提出了串行解决方案和并行解决方案。对于下一个作业,我们必须改进并行解决方案,而老师告诉我们,这是一种实现方法。


一只名叫tom的猫
浏览 189回答 1
1回答

吃鸡游戏

您将列表添加到队列中并清除它:arrayBlockingQueueInput.put(results); results.clear();您需要执行以下操作将列表副本添加到队列中,以免clear()清理队列中的列表:arrayBlockingQueueInput.put(new&nbsp;ArrayList<String>(results)); results.clear();
随时随地看视频慕课网APP

相关分类

Java
我要回答