Java - LinkedBlockingQueue问题

标签 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  } 
   

我的问题是当条件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/

相关文章:

java - 不阻塞的有界 BlockingQueue

java - 如何使用 typescript 中的属性对对象数组进行分组?

java - Java 中 BlockingQueue 上的并发 put 调用

java - 当从java创建excel文件时,我的系统上是否需要安装office

java - 避免大图像将其他布局推出屏幕

java - ArrayBlockingQueue NoSuchElementException

Java BlockingQueue take() 在 while 循环中

java - 如何让 ThreadPoolExecutor 在排队之前将线程增加到最大值?

java - 从资源中获取文件名(带路径)

java - Repeater 中的 JSF Map 绑定(bind)