伙计我在Tree Set
和Thread Pool Executor
以下是该场景:
第一种方法
treeset constructor
(带comparator
接口)第二种方法
Thread pool executor
的核心功能,为此我从this link获取灵感,并且我已经通过这种方法实现了我的要求首先执行优先级任务,然后执行它,执行所有任务的方式相同。现在我的困惑是哪一个最好用于性能成本,灵活性(增加/减少线程)等,为什么我应该选择它?
非常感谢任何建议和答案。
答案 0 :(得分:0)
您的问题中嵌入了两种不同的优先级概念:
起始优先级: tasks 的顺序被提交执行,(第一个方法解释的第1点)
运行时优先级:线程的顺序被考虑用于调度(第3点)
这两个属性在您的方案中恰好相同,因此树集将帮助您定义它们。执行程序将帮助您强制执行它们,但是您需要一个特定的ad-hoc执行程序(基于线程池或不基于线程池),以特定的优先级启动您的线程。基本上,每次从优先级队列中拉出任务时,它应该与在任务的优先级别设置的线程相关联。我假设这是执行器实现在您链接的文章中提供的功能,因此也就是您所做的。
至于线程池,来自文档:
使用工作线程可以最大限度地减少因创建线程而产生的开销。线程对象使用大量内存,在大型应用程序中,分配和释放许多线程对象会产生大量的内存管理开销。
工作线程是由线程池管理的线程,并且保守地回收(而不是销毁和重新创建),以处理任务序列。我不认为它在优先处理方面很重要,但它会优化您对资源的使用。
关于本文的实现,代码使用简单的阻塞deque来处理传入的任务,因此它是一个普通的fifo优先级方案。它没有重新排序任务。
答案 1 :(得分:0)
终于从这两个中获得了真正的赢家。我应该选择Thread pool Executor
,原因如下
thread pool executor
架构中的工作线程数量,反之亦然。comparator
接口的帮助下检查,尽管它具有复杂性 O(logn) 但之后我们必须获取它并且它将成为单一来源的顺序流,因此我们不会有多线程环境优势。 等是我在沉重的脑力冲击,谷歌搜索和最后但最不重要的堆栈溢出搜索中指出的原因。感谢大家的谦虚支持和对@didierc的高度赞赏,让我明白这一点。
答案 2 :(得分:0)
您可以在普通的线程池中尝试使用DelayedQueue。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(size, size, 0, TimeUnit.DAYS, new DelayQueue<>());
threadPoolExecutor.execute(runnable);
可运行应该是可比较。因此,在此实现中,优先级将由延迟标记来处理。
这种方法更容易实现。