Java - LinkedBlockingQueue问题

时间:2011-05-10 11:49:44

标签: java blockingqueue

    1  LinkedBlockingQueue queJobs = new LinkedBlockingQueue(150);
    2  ..........
    3  .. Some other code....
    4  ..........
    5  Job curJob = queJobs.take();
    6  ....................
    7  .. Again some other code...
    8  ....................
    9  if(condition1){
    10    queJobs.put(curJob);
    11  } 
   

我的问题是当condition1为true时,我将对象放回队列中。但最初它是在队列的顶部,但在推杆后,它将在队列的末尾。
我的要求是:
我可以将元素放回队列的顶部

2.我可以在第5行等待,而不从队列中删除元素。

3 个答案:

答案 0 :(得分:3)

队列定义为在一端读取并在另一端写入。所以不,不能把它放回去。 但是你可以改用LinkedBlockingDeque,这在这方面更为通用。

如果这不是一个选项,您可以使用peek()获取curJob,但不能删除if (!condition1),之后只删除它{{1}}。

<强>更新

  

但我使用的是take(),因为它会阻止执行,直到队列为空。

peek()肯定不适合你。但我怀疑你的整体逻辑存在缺陷。通常,您不必将作业放回队列中。也许更好的解决方案是使用另一个只为工作线程所知的集合,在那里放置已启动但尚未完成的作业,并在作业队列之前从该集合中读取。

答案 1 :(得分:1)

您可以使用peek()来检索头部但不会将其删除。然后检查condition1是否为false。如果是,则使用take()将其删除。

可以将元素添加回头部,但它很麻烦。您可以调用toArray()。toList(),它支持在索引0处添加。

参考:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

答案 2 :(得分:1)

更自然的选择可能是使用PriorityBlockingQueue,它允许您为元素分配优先级。这不是你要求的,但只是一个建议。