有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

伙计们,我在Tree SetThread Pool Executor之间进退两难

以下是场景:

第一种方法

  1. 我必须使用有任务的结构,每个任务都有优先级。现在基于treeset constructor(带有comparator接口)
  2. 我可以比较任务的优先级,并在此基础上,任务的顺序是正确的
  3. 然后,通过树集合的迭代,按优先级顺序处理任务,并逐个执行每个任务

第二种方法

  1. 第二种方法是进行某种逻辑构建,并使用Thread pool executor的核心功能,为此,我从this link中获得了灵感,并通过这种方法实现了我的要求,这种方法将首先选择高优先级任务,然后首先执行它,并以同样的方式执行所有任务

现在我的困惑是,从性能成本、灵活性(增加/减少线程)等方面来看,哪一个是最好的,为什么我应该选择它

非常感谢您的建议和回答


共 (3) 个答案

  1. # 1 楼答案

    你的问题中有两种不同的优先权概念:

    • 开始优先级:任务提交执行的顺序(第一次方法说明的第1点)

    • 运行时优先级:按照线程的顺序进行调度(第3点)

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

    对于线程池,请参阅文档:

    Using worker threads minimizes the overhead due to thread creation. Thread objects use a significant amount of memory, and in a large-scale application, allocating and deallocating many thread objects creates a significant memory management overhead.

    工作线程是由线程池管理的线程,它们被保守地回收(而不是销毁和重新创建),以处理任务序列。我认为这与优先级处理无关,但它会优化资源的使用

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

  2. # 2 楼答案

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

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

    可运行的应该是可比较的。因此,在这个实现中,优先级将由delayedqueue负责

    这种方法将更容易实现

  3. # 3 楼答案

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

    1. 性能成本:在这里,如果我们看到的话,最大限度地使用资源是在重载时获得性能的主要动机。因此,如果我们在这么长的时间内使用线程,它将提供高性能,作为多线程的一个优势
    2. 灵活性:在可伸缩的资源使用方面的灵活性,即在较低的时间内,我们可以减少thread pool executor体系结构中的工作线程数量,反之亦然
    3. 更少的迭代次数和最少的更新:如果我们每次都维护树集,它将在comparator接口的帮助下进行检查,尽管它具有复杂性O(logn),但之后我们必须获取它,它将成为单源的顺序流,因此我们不会利用多线程环境优势
    4. 更快的处理:借助线程体系结构,我们可以实现更快的输出

    等是我在一次头脑风暴、谷歌搜索和最后但并非最不重要的堆栈溢出搜索中指出的原因。感谢大家对@didierc的谦逊支持和巨大感谢,感谢你们让我明白了这一点