首页 文章

具有强制排队的ThreadPoolExecutor

提问于
浏览
1

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

我想要一个稍微不同的行为 . 我希望将所有任务强制提交给BlockingQueue和executor服务,以仅从队列中轮询任务 .

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

我知道这个模型有问题 . 只有在通过execute()方法将任务提交给执行程序时,才会创建传统ThreadPoolExecutor中的核心线程 . 现在,如果我覆盖execute()方法直接将任务排队到BlockingQueue,它可能不会创建Core线程 . 我可以通过PreStarting Core线程并将其设置为Timeout来解决这个问题,因此核心线程将永远存在 . 我还需要验证num核心线程未配置为0 .

这个模型会起作用吗?我错过了处理一些案件吗?你的意见 .

1 回答

  • 1

    如果我理解正确,您将向一些ThreadPool提交任务,但是您想要选择是否真的根据某些逻辑处理这些任务?在这种情况下:

    • 为什么不在将任务提交给执行人之前检查任务是否符合处理条件?

    • 您可以随时在任务内部进行检查作为第一条指令 - 如果检查失败,那么只需从任务中选择 return - 这将为检查逻辑提供多线程 .

    • 我真的没有理由坚持用硬盘和凌乱的方式来执行它,重写Executor,BlockingQueue,预先实例化线程以及可能的其他黑客攻击 .

    • ThreadPoolExecutor不负责决定是否应该执行提交的任务 - 它是任务提交者的责任,或者任务本身可以包含这样的逻辑,以决定在没有太多处理的情况下提前完成 .

相关问题