java最佳方法:树集结构与线程池执行器
伙计们,我在Tree Set
和Thread Pool Executor
之间进退两难
以下是场景:
第一种方法
- 我必须使用有任务的结构,每个任务都有优先级。现在基于
treeset constructor
(带有comparator
接口) - 我可以比较任务的优先级,并在此基础上,任务的顺序是正确的李>
- 然后,通过树集合的迭代,按优先级顺序处理任务,并逐个执行每个任务李>
第二种方法
- 第二种方法是进行某种逻辑构建,并使用
Thread pool executor
的核心功能,为此,我从this link中获得了灵感,并通过这种方法实现了我的要求,这种方法将首先选择高优先级任务,然后首先执行它,并以同样的方式执行所有任务李>
现在我的困惑是,从性能成本、灵活性(增加/减少线程)等方面来看,哪一个是最好的,为什么我应该选择它
非常感谢您的建议和回答
# 1 楼答案
你的问题中有两种不同的优先权概念:
开始优先级:任务提交执行的顺序(第一次方法说明的第1点)
运行时优先级:按照线程的顺序进行调度(第3点)
在您的场景中,这两个属性恰好相等,因此树集将帮助您定义这两个属性。执行器将帮助您执行它们,但您需要一个特别定制的执行器(基于线程池与否),以特定的优先级启动您的线程。基本上,每次任务从优先级队列中拉出时,它都应该与任务优先级上设置的线程相关联。我假设这就是您链接的文章中的executor实现所提供的功能,以及您所做的工作
对于线程池,请参阅文档:
工作线程是由线程池管理的线程,它们被保守地回收(而不是销毁和重新创建),以处理任务序列。我认为这与优先级处理无关,但它会优化资源的使用
关于本文中的实现,代码使用一个简单的阻塞deque来处理传入任务,因此它是一个简单的fifo优先级方案。它不会对任务进行重新排序
# 2 楼答案
您可以尝试在普通线程池中使用DelayedQueue
可运行的应该是可比较的。因此,在这个实现中,优先级将由delayedqueue负责
这种方法将更容易实现
# 3 楼答案
最终从这两个游戏中获得了真正的赢家。我应该选择
Thread pool Executor
,原因如下thread pool executor
体系结构中的工作线程数量,反之亦然李>comparator
接口的帮助下进行检查,尽管它具有复杂性O(logn),但之后我们必须获取它,它将成为单源的顺序流,因此我们不会利用多线程环境优势李>等是我在一次头脑风暴、谷歌搜索和最后但并非最不重要的堆栈溢出搜索中指出的原因。感谢大家对@didierc的谦逊支持和巨大感谢,感谢你们让我明白了这一点