最佳方法:树集结构与线程池执行程序

时间:2014-11-26 07:03:21

标签: java multithreading collections priority-queue threadpoolexecutor

伙计我在Tree SetThread Pool Executor

之间处于两难境地

以下是该场景:

第一种方法

  1. 我必须使用其中包含任务的结构以及每个任务的优先级。现在基于treeset constructor(带comparator接口)
  2. 我可以比较优先级的任务,并在此基础上正确排序任务。
  3. 此后,任务应按优先顺序通过迭代树集处理,逐个执行每个任务。
  4. 第二种方法

    1. 第二种方法是进行某种逻辑构建并使用Thread pool executor的核心功能,为此我从this link获取灵感,并且我已经通过这种方法实现了我的要求首先执行优先级任务,然后执行它,执行所有任务的方式相同。
    2. 现在我的困惑是哪一个最好用于性能成本,灵活性(增加/减少线程)等,为什么我应该选择它?

      非常感谢任何建议和答案。

3 个答案:

答案 0 :(得分:0)

您的问题中嵌入了两种不同的优先级概念:

  • 起始优先级: tasks 的顺序被提交执行,(第一个方法解释的第1点)

  • 运行时优先级:线程的顺序被考虑用于调度(第3点)

这两个属性在您的方案中恰好相同,因此树集将帮助您定义它们。执行程序将帮助您强制执行它们,但是您需要一个特定的ad-hoc执行程序(基于线程池或不基于线程池),以特定的优先级启动您的线程。基本上,每次从优先级队列中拉出任务时,它应该与在任务的优先级别设置的线程相关联。我假设这是执行器实现在您链接的文章中提供的功能,因此也就是您所做的。

至于线程池,来自文档:

  

使用工作线程可以最大限度地减少因创建线程而产生的开销。线程对象使用大量内存,在大型应用程序中,分配和释放许多线程对象会产生大量的内存管理开销。

工作线程是由线程池管理的线程,并且保守地回收(而不是销毁和重新创建),以处理任务序列。我不认为它在优先处理方面很重要,但它会优化您对资源的使用。

关于本文的实现,代码使用简单的阻塞deque来处理传入的任务,因此它是一个普通的fifo优先级方案。它没有重新排序任务。

答案 1 :(得分:0)

终于从这两个中获得了真正的赢家。我应该选择Thread pool Executor,原因如下

  1. 性能成本:如果我们看到,使用资源最大值是在重负载期间获得性能的主要动机。因此,如果我们在这么高的时间内使用线程,它将提供高性能作为优势多线程。
  2. 灵活性:在资源的可扩展使用方面具有灵活性,即在低时间内我们可以减少thread pool executor架构中的工作线程数量,反之亦然。
  3. 更少的迭代次数和最少的更新:如果我们每次都维护树集,它将在comparator接口的帮助下检查,尽管它具有复杂性 O(logn) 但之后我们必须获取它并且它将成为单一来源的顺序流,因此我们不会有多线程环境优势。
  4. 加快处理速度:借助线程架构,我们可以实现更快的输出。
  5. 等是我在沉重的脑力冲击,谷歌搜索和最后但最不重要的堆栈溢出搜索中指出的原因。感谢大家的谦虚支持和对@didierc的高度赞赏,让我明白这一点。

答案 2 :(得分:0)

您可以在普通的线程池中尝试使用DelayedQueue。

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(size, size, 0, TimeUnit.DAYS, new DelayQueue<>());
threadPoolExecutor.execute(runnable);

可运行应该是可比较。因此,在此实现中,优先级将由延迟标记来处理。

这种方法更容易实现。