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 }
我的问题是当条件1为真时,我将对象放回到队列中。但最初它位于队列的顶部,但是放入后,它将位于队列的末尾。
我的要求是:
1.我可以将元素放回队列顶部
或
2. 不知何故,我可以在第 5 行等待,而不从队列中删除元素。
最佳答案
队列被定义为在一端读取并在另一端写入。所以不行,不能放回去。 但您可以使用 LinkedBlockingDeque相反,它在这方面更加通用。
如果这不是一个选项,您可以使用 peek() 获取但不能删除 curJob
,稍后仅将其删除 if (!condition1)
。
更新
but I am using take() because, it blocks the execution until queue is empty.
peek() 肯定不适合你。但我怀疑你的整体逻辑有缺陷。通常您不必将作业放回队列中。也许更好的解决方案是使用另一个只有工作线程知道的集合,您将启动但尚未完成的作业放在其中,并在作业队列之前从该集合中读取。
关于Java - LinkedBlockingQueue问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5949546/