java blockingqueue 消费者阻塞队列满
java blockingqueue consumer block on full queue
我正在编写一个小程序,将 Twitter public 流中的推文放入 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();
}
}
在主函数中创建并启动了两个线程:
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();
程序运行了一段时间没有任何问题,然后突然停止了。此时队列已满,消费者似乎无法从中获取新状态。我尝试了 producer/consumer 模式的几种变体,但都没有成功。没有抛出异常。
我不知道要查找故障。我希望有人能给我提示或解决方案。
如果使用阻塞队列,请仔细检查代码中的阻塞命令(ArrayBlockingQueue 的 put 和 take),如果使用多个列表,请仔细检查拼写错误。
我正在编写一个小程序,将 Twitter public 流中的推文放入 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();
}
}
在主函数中创建并启动了两个线程:
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();
程序运行了一段时间没有任何问题,然后突然停止了。此时队列已满,消费者似乎无法从中获取新状态。我尝试了 producer/consumer 模式的几种变体,但都没有成功。没有抛出异常。
我不知道要查找故障。我希望有人能给我提示或解决方案。
如果使用阻塞队列,请仔细检查代码中的阻塞命令(ArrayBlockingQueue 的 put 和 take),如果使用多个列表,请仔细检查拼写错误。