完整队列上的java blockqueue使用者阻止

时间:2015-10-19 22:31:08

标签: java blockingqueue consumer take

我正在编写一个小程序,将Twitter公共流中的推文放入HBase数据库。该程序使用两个线程,一个用于收集推文,另一个用于处理它们。 第一个线程使用twitter4j StatusListener来获取推文并将它们放入容量为100的ArrayBlockingQueue中。 第二个线程从队列中获取状态,过滤所需的数据并将它们移动到数据库。 处理过程比收集状态需要更多时间。

制作人看起来像这样:

public void onStatus(Status status) {
    try {
        this.queue.put(status);
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

消费者使用take并调用函数来处理新状态:

public void run() {
    try {
        while(true) {
            // Get new status to process
            this.status = this.queue.take();
            this.analyse();
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
 }

在main函数中创建并启动了两个线程:

ArrayBlockingQueue<Status> queue_public = new ArrayBlockingQueue<Status>(100);

Thread ta_public = new Thread(new TweetAnalyser(cl.getOptionValue("config"), queue_public));
Thread st_public = new Thread(new RunPublicStream(cl.getOptionValue("config"), queue_public));

ta_public.start();
st_public.start();

程序运行一段时间没有任何问题,但随后突然停止。此时队列已满,似乎消费者无法从中获取新状态。我尝试了生产者/消费者模式的几种变体而没有成功。没有例外。

我不知道是不是要找失败。我希望有人能给我一个提示或解决方案。

1 个答案:

答案 0 :(得分:0)

如果使用阻塞队列,如果使用多个列表,请在代码和拼写错误中检查阻塞命令(put和take for ArrayBlockingQueue)。