我正在解析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();
答案 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
。这是一种替代方案,可让您同时运行parser
和parser
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}循环以完成从队列中删除项目。