java.util.PriorityQueue允许Comparator在施工时通过.插入元素时,会根据比较器指定的优先级对它们进行排序.
插入元素后,当元素的优先级发生变化时会发生什么?什么时候PriorityQueue重新排序元素?是否可以轮询实际上没有最低优先级的元素?
是否有优先级队列的良好实现,允许有效的优先级更新?
Python有Queue.PriorityQueue,但我看不到一种方法来使其中的每个值都是唯一的,因为没有方法可以检查值是否已经存在(如find(name)或类似).此外,PriorityQueue需要优先级保持在该值内,因此我甚至无法搜索我的值,因为我还必须知道优先级.您将使用(0.5,myvalue)作为PriorityQueue中的值,然后它将按元组的第一个元素排序.
另一方面,collections.deque类提供了一个函数,用于检查值是否已经存在并且在使用中更自然(没有锁定,但仍然是原子的),但它没有提供按优先级排序的方法.
stackq上有一些其他实现与heapq,但heapq也使用值内的优先级(例如在元组的第一个位置),所以它似乎不是很好的比较已有的值.
使用唯一值创建原子优先级队列(=可以从多个线程使用)的最佳方法是什么?
我要添加的示例:
在我的JavaEE Web应用程序中,我需要严格按照到达顺序处理传入的消息.我假设我的webapp容器(Tomcat 6)在到达http端口时保留了消息的顺序.
是什么让我头痛,是我在内部处理这些消息的方式.为了改善工作量,我将每个消息的处理附加到ThreadPool,因为这里需要做很多事情,例如XML解析,有时使用外部Web服务来丰富数据.处理完成后,我将消息的java表示推送到复杂的流处理引擎esper.codehaus.org,这是线程安全的.这里,检查不同的模式,其中入口顺序是最高要求,例如现象的阈值超过.
我有想法将每个已处理的消息插入到PriorityQueue中,并在到达时收到优先级ID(在我的Servlet中,每个消息都会递增).问题如下:
从队列中轮询元素(最低ID是队列的头部)以将其插入esper的线程可以跳过ID,因为它不检查丢失的项目.我猜插图效果更好:

对于步骤(1)至(4),一切都按预期工作.但是在步骤(5),QueuePoller检索元素6而不是元素4(稍后在步骤(6)插入).这导致消息顺序:2; 3; 6; 4.
我试图做的是改变轮询队列头部的实现,以遵循严格的ID顺序.意思是,如果下一个ID的元素尚未插入到队列中,则在屏障处等待直到其中.这似乎在前10分钟有效但随后被绞死,可能是由于一个从未插入队列的元素.
过去有过类似问题的人对我有一些暗示吗?
我试图在java中使用优先级最低的节点创建优先级队列.但是,我的比较器不工作,输出非常奇怪.我相信我需要改变我的比较器,但我不知道如何改变它.这是我的代码:
public class HuffmanComparator implements Comparator<TreeNodeHuffman> {
public int compare(TreeNodeHuffman p1, TreeNodeHuffman p2) {
if (p1.frequency < p2.frequency) return -1;
if (p1.frequency > p2.frequency) return 1;
return 0;
}
}
public class TreeNodeHuffman {
public static void main(String[] args) {
HuffmanComparator compare = new HuffmanComparator();
TreeNodeHuffman e = new TreeNodeHuffman('e', 12702);
TreeNodeHuffman t = new TreeNodeHuffman('t', 9056);
TreeNodeHuffman a = new TreeNodeHuffman('a', 8167);
TreeNodeHuffman o = new TreeNodeHuffman('o', 7507);
TreeNodeHuffman i = new TreeNodeHuffman('i', 6966);
TreeNodeHuffman n = new TreeNodeHuffman('a', …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个也是一个Set的PriorityQueue实现.
的compareTo,如果它的元素一定不能有要求实施与执行相一致equals.
有没有这样的java实现?
更新:我现在使用SortedSet作为内部集合来实现它.所以我只需要实现缺少的方法来满足队列接口.我也忘了提到它也必须是一个有界的队列,因此它具有容量并在达到容量时丢弃该组的最后一个元素.
使用stl,priority_queue您可以设置基础容器,例如a vector.为stl指定容器有哪些优点priority_queue?
在Java中,我不知道如何PriorityQueue使用新的比较器创建一个新的比较但没有给出队列长度?我该如何创建它?
我知道我可以写:
Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>();
Run Code Online (Sandbox Code Playgroud)
但是我希望队列可以工作LinkedList,我的意思是它的长度不固定,我怎么能声明呢?
我试着Maximum Waiting Time进入我的内心PQueue.这 Maximum Waiting Time将PQueue自动检查我是否有任何links等待Maximum Waiting Time删除它.我对我的代码进行了这项更改,但它在删除链接后正好停止了.我想PQueue根据等待时间条件删除我的所有元素.你能告诉我这里缺少什么吗?
这是我的班级:
public class MyClass {
public static PriorityQueue <LinkNodeLight> PQueue = new PriorityQueue <> ();
private static Set<String> DuplicationLinksHub = new LinkedHashSet <> ();
private static Integer IntraLinkCount = new Integer (0);
private static Integer InterLinkCount = new Integer (0);
private static Integer DuplicationLinksCount = new Integer (0);
private static Integer MaxWaitTime = new Integer (60000); // 1 M= …Run Code Online (Sandbox Code Playgroud) 我test在芹菜中有一个队列,我已经为它定义了一个任务:
@celery_app.task(queue='test', ignore_result=True)
def priority_test(priority):
print(priority)
Run Code Online (Sandbox Code Playgroud)
刚刚打印argument.I要设置priority其定义属性在这里进行appy_async。所以,我写了一个for loop这样的:
for i in range(100):
priority_test.apply_async((i%10,), queue="test", priority=i%10)
Run Code Online (Sandbox Code Playgroud)
我希望看到这样的结果:
[2017-12-26 17:21:37,309: WARNING/ForkPoolWorker-1] 10
[2017-12-26 17:21:37,311: WARNING/ForkPoolWorker-1] 10
[2017-12-26 17:21:37,314: WARNING/ForkPoolWorker-1] 10
[2017-12-26 17:21:37,317: WARNING/ForkPoolWorker-1] 9
[2017-12-26 17:21:37,319: WARNING/ForkPoolWorker-1] 9
[2017-12-26 17:21:37,321: WARNING/ForkPoolWorker-1] 9
[2017-12-26 17:21:37,323: WARNING/ForkPoolWorker-1] 8
[2017-12-26 17:21:37,326: WARNING/ForkPoolWorker-1] 8
[2017-12-26 17:21:37,329: WARNING/ForkPoolWorker-1] 8
[2017-12-26 17:21:37,332: WARNING/ForkPoolWorker-1] 7
[2017-12-26 17:21:37,334: WARNING/ForkPoolWorker-1] 7
[2017-12-26 17:21:37,336: WARNING/ForkPoolWorker-1] 7
[2017-12-26 17:21:37,341: WARNING/ForkPoolWorker-1] 6
[2017-12-26 17:21:37,344: …Run Code Online (Sandbox Code Playgroud) 我试图在Python中使用 PriorityQueue 构建一个优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,而不是考虑进行优先级比较的元素,类似于sorted(mtlist,key = myfun),有没有办法实现这一点,
priority-queue ×10
java ×6
python ×3
queue ×2
c++ ×1
celery ×1
comparator ×1
concurrency ×1
printing ×1
rabbitmq ×1
search ×1
set ×1
sorting ×1
stl ×1