gpt4 book ai didi

Java - 在删除/获取上排序的线程安全集合

转载 作者:行者123 更新时间:2023-12-02 06:01:39 25 4
gpt4 key购买 nike

我有一种情况,我需要一个线程安全队列,每次调用remove()方法时并且仅在调用该方法时运行排序。这是因为对象在被添加到集合中后由于外部因素可以动态地改变“优先级”。这也需要是线程安全的。扩展像 PriorityBlockingQueue 这样的东西是没有意义的,因为它会在添加时运行比较函数。我未能找到任何这样的集合/队列,因此我尝试通过仅环绕数组列表来实现我自己的集合/队列:

public class BlockingSortOnTakeQueue<E> implements Queue<E>
{
private ArrayList<E> m_list;

public BlockingSortOnTakeArrayList()
{
m_list = new ArrayList<>();
}


@Override
public synchronized E remove()
{
m_list.sort(m_comparator);
return m_list.remove(0);
}

....

不幸的是,我很难弄清楚如何确保对象类型 <E>必须实现可比较接口(interface),并在尝试对列表进行排序时使用该对象的compareTo函数(在代码中我有m_comparator,它是未完成/占位符)。

有谁知道仅在remove()上排序的线程安全队列或如何修复自定义集合的开头以便使用通用对象compareTo函数对列表进行排序。

最佳答案

看起来你正在按照必须做的方式做这件事。要强制使用 Comparable 接口(interface),请编写

public class BlockingSortOnTakeQueue<E extends Comparable<E>> implements Queue<E> {
...
@Override
public synchronized E remove() {
Collections.sort(m_list);
return m_list.remove(0);
}
}

...尽管使用 Collections.sort(m_list, Collections.reverseOrder()) 以相反顺序排序可能对您有利,并删除最后一个元素,因为这样更快在 ArrayList 中。

最好只识别最小元素,而不是对整个列表进行排序,这将是 O(n) 而不是 O(n log n)。

关于Java - 在删除/获取上排序的线程安全集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com