强制排队的ThreadPoolExecutor

时间:2017-08-22 18:25:27

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

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

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

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

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

这种模式会起作用吗?我错过了处理一些案件吗? 你的想法。

1 个答案:

答案 0 :(得分:1)

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

  1. 为什么在将任务提交给执行人之前不检查任务是否符合处理条件?
  2. 您可以随时将任务内部的检查作为第一条指令进行检查 - 如果检查失败,那么只需从任务中return - 这将为检查逻辑提供多线程。
  3. 我真的没有理由坚持用硬盘和凌乱的方式来执行它,重写Executor,BlockingQueue,预先实例化线程以及其他可能的黑客攻击。
  4. ThreadPoolExecutor不负责决定是否应该执行提交的任务 - 它是任务提交者的责任,或者任务本身可以包含这样的逻辑,以决定在没有太多处理的情况下提前完成。