0
    1 LinkedBlockingQueue queJobs = new LinkedBlockingQueue(150);
    2 …………
    3 .. 一些其他代码....
    4 …………
    5 工作 curJob = queJobs.take();
    6 .....................
    7 .. 又是一些其他代码...
    8 .....................
    9 如果(条件1){
    10 queJobs.put(curJob);
    11 }
   

我的问题是当条件 1 为真时,我将对象放回队列中。但最初它在队列的顶部,但在放置后,它将排在队列的末尾。
我的要求是:
1.我可以将元素放回队列顶部

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

4

3 回答 3

3

队列被定义为在一端读取并在另一端写入。所以不,不能放回去。但是您可以使用LinkedBlockingDeque代替,这在这方面更加通用。

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

更新

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

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

于 2011-05-10T12:03:46.113 回答
1

您可以使用 peek() 检索头部但不删除它。然后稍后检查条件1是否为假。如果是,则使用 take() 将其删除。

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

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

于 2011-05-10T11:54:37.830 回答
1

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

于 2011-05-10T12:02:17.827 回答