处理BlockingQueue中的所有元素

时间:2013-06-24 15:33:43

标签: java blockingqueue

我正在解析XML文档,根据我解析的信息构建对象,然后将该对象放入阻塞队列。

出于测试目的,阻塞队列的大小为3,我需要处理4个页面。我想要发生的是,在添加了所有可能的对象之后,它们都应该被取消。我尝试使用while循环(如下所示)将所有元素从队列中取出,但似乎有一个空值阻止它通过队列的其余部分。

我是Java新手,我猜这就是我的麻烦所在。

任何帮助都将不胜感激。

Runnable parser = new Runnable()
{
    public void run()
    {
        try
        {
            saxParser.parse("file_to_parse.xml", handler);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
};

Runnable takeOff = new Runnable()
{
    public void run()
    {
        try
        {
            while(handler.bq.peek() != null)
            {
                handler.bq.take();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
};

new Thread(parser).start();
new Thread(takeOff).start();

1 个答案:

答案 0 :(得分:3)

一个问题是take将阻塞空队列(poll是在空队列上返回null的方法),因此你的循环不会终止(除非{{1在队列中添加一个null,这应该是一个错误)。你也经常调用parser - 第一个take调用(在while循环的守卫中)正在删除一个元素,然后第二个take调用(在while循环内)是删除另一个元素,这意味着你要丢弃一半队列的元素。尝试这样的事情

take

只有在try { String temp; while((temp = handler.bq.poll()) != null) { // process temp } } 完成向队列中添加项目(takeOff返回false时)才开始parser时,这才会起作用 - 否则offer可能会返回当poll仍在向队列添加项目时,null并终止takeOff。这是一种替代方案,可让您同时运行parserparser

takeOff

然后当String temp; try { while(true) { temp = handler.bq.take(); // process temp } catch (InterruptedException ex) { // ignore exception } while((temp = handler.bq.poll()) != null) { // process temp } 完成时你需要interrupt() takeOff线程:这将退出parser循环,之后线程将转到{{1}循环以完成从队列中删除项目。