【问题标题】:ThreadPoolExecutor with forced queuing具有强制排队的 ThreadPoolExecutor
【发布时间】:2018-01-31 03:33:43
【问题描述】:

传统的 ThreadPoolExecutor 仅在没有可用于传入任务的空闲核心线程时使用提供的 BlockingQueue 来对项目进行排队。如果有空闲的核心线程,执行器会尝试直接为传入的任务分配线程。

我想要一个稍微不同的行为。我希望所有任务都被强制提交到 BlockingQueue 和执行器服务以仅从队列中轮询任务。

我将拥有自己的 BlockingQueue 实现,它将根据检查在 poll() 中提供项目(检查业务逻辑是否通过以处理任务),如果检查失败,则不会在 poll() 中提供项目.我相信,ThreadPoolExecutor 已经实现,假设 poll() 返回 null 不一定意味着队列为空。

我知道此模型存在问题。传统的 ThreadPoolExecutor 中的核心线程只有在任务通过其 execute() 方法提交给 executor 时才会创建。现在,如果我重写 execute() 方法以直接将任务排队到 BlockingQueue,它可能不会创建核心线程。我可以通过预先启动核心线程并将其设置为不超时来解决此问题,因此核心线程将始终处于活动状态。我还需要验证 num core threads 没有配置为 0。

这个模型行得通吗?我想处理一些案件吗? 你的想法。

【问题讨论】:

    标签: java multithreading concurrency java.util.concurrent threadpoolexecutor


    【解决方案1】:

    如果我理解正确的话,你会将任务提交到某个 ThreadPool,但是你想选择是否真的会根据某些逻辑来处理这些任务?在这种情况下:

    1. 为什么不在将任务提交给 Executor 之前检查它是否符合处理条件?
    2. 您始终可以在任务中作为第一条指令进行检查 - 如果检查失败,则只需从任务中return - 这将为您提供用于检查逻辑的多线程。
    3. 我真的看不出有任何理由坚持以艰难而混乱的方式来覆盖 Executor、BlockingQueue、预实例化线程以及可能的其他 hack。
    4. ThreadPoolExecutor 不负责决定是否应该执行提交的任务 - 这是任务提交者的责任,或者任务本身可能包含这样的逻辑来决定提前完成而无需太多处理。

    【讨论】:

    • (1) 这些是异步处理。如果检查失败,我不想丢弃项目,但想将它们排队一段时间并尝试处理。 (2) 我将不得不在循环中进行检查(忙等待),所有活动线程都将忙于等待进行检查。调度到队列并从中使用它,仅使 threadPool 的调度程序线程执行检查作为其轮询的一部分,无论如何它都在循环中运行,无限地轮询队列。注意:我对所有任务的检查都是相同的(例如,检查所有任务通用的底层资源的运行状况)
    • 方法 runWorker() 有一个复杂的逻辑,但是它调用 getTask() 并且这个方法阻塞在队列上,直到它返回一些任务,从队列中返回 null 将停止工作 - 你已经假设其他人。这不是一个好主意,我怎么能告诉你?请不要让您的生活或与您一起工作的其他开发人员的生活成为一场噩梦——这段代码会让您非常痛苦。相反,请考虑如何使用现有的标准机制来实现您的目标。如需灵感,请阅读 Java Concurrency in Practice 一书。
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2013-02-08
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多