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行等待,而不从队列中删除元素。
答案 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,它允许您为元素分配优先级。这不是你要求的,但只是一个建议。