【问题标题】:ConcurrentLinkedQueue and list methodsConcurrentLinkedQueue 和列表方法
【发布时间】:2012-12-08 01:48:46
【问题描述】:

我目前正在寻找一个线程安全的程序,允许我在我的程序中实现时间优先级。如果您愿意,我很乐意与您分享代码,但这对我的问题并不重要,我认为这并不重要。我最初在启动并运行该程序的(非线程安全)版本时使用了链表,但现在我要切换到线程安全版本,我已经从链表更改为并发链接队列。问题是我需要从队列中获取元素(通常从头部,偶尔从尾部)。我真的只需要看看头部的元素是否满足某个属性。在链表版本中,它看起来像:

if (order.getQuantity()>= a.getFirst().getQuantity()){
                        Fill orderfill = new  Fill(a.getFirst().getQuantity(),a.getFirst().getLimitPrice(), order.getOrderID(),a.getFirst().getOrderID());
                        fills.add(orderfill);
                        order.setQuantity(order.getQuantity()-a.getFirst().getQuantity());
                        a.removeFirst();

这里的“a”是我的链表。当我更改为并发链接队列时,getFirst 方法不再存在。是否有一种队列友好的方法可以实现与链表的 getFirst 或 getLast 方法相同的目标? (如您所见,我只需要获取该对象,就可以开始使用与该对象相关的方法来处理其他事情)。

非常感谢!

【问题讨论】:

    标签: java linked-list queue


    【解决方案1】:

    您可能想使用ConcurrentLinkedDeque,它提供getFirst()getLast() 方法。

    【讨论】:

    • 那一个线程安全吗?我没有看到任何文档方面的说法。
    • 链接中有:“并发插入、删除和访问操作在多个线程中安全执行。”
    • 哦,我明白了,抱歉我没看到。 (不知道怎么错过了,一开始就在那里)。
    • 这是如何向双端队列添加元素的?我很快就接受了答案并称其为好,但我喜欢链表和队列方法的原因之一是它是一种先进先出的结构。但是,它似乎不像 deque 那样工作(它允许在两端插入)?那么如果我要使用这种方式,我该如何保持先进先出的性质呢?编辑:没关系,这扩展了 FIFO 队列,所以我可以将其视为队列,这很好,对吧?
    • @user1849003 完全正确。您可以将其视为普通队列,但有时会“偷看”最后一个元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多