Java 具有强制队列的ThreadPoolExecutor

Java 具有强制队列的ThreadPoolExecutor,java,multithreading,concurrency,java.util.concurrent,threadpoolexecutor,Java,Multithreading,Concurrency,Java.util.concurrent,Threadpoolexecutor,传统的ThreadPoolExecutor仅在传入任务没有可用的空闲核心线程时,才使用提供的BlockingQueue对项目进行排队。如果存在空闲的核心线程,执行器将尝试直接为传入任务分配线程 我想要一个稍微不同的行为。我希望所有任务都强制提交到BlockingQueue,executor服务只从队列轮询任务 我将有我自己的BlockingQueue实现,它将根据检查在poll()中提供项目(检查处理任务的业务逻辑过程),如果检查失败,将不会在poll()中提供项目。我相信,ThreadPool

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

我想要一个稍微不同的行为。我希望所有任务都强制提交到BlockingQueue,executor服务只从队列轮询任务

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

我知道这个模型有一个问题。传统ThreadPoolExecutor中的核心线程仅在任务通过其execute()方法提交给执行器时创建。现在,如果我重写execute()方法将任务直接排入BlockingQueue,它可能不会创建核心线程。我可以通过预启动核心线程并将其设置为不超时来解决这个问题,这样核心线程将始终处于活动状态。我还需要验证num核心线程是否未配置0

这个模型行得通吗?我是不是错过了处理案件的机会?
你的想法。

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

  • 在将任务提交给执行者之前,为什么不检查任务是否符合处理条件
  • 您始终可以在任务内部执行检查,作为第一个指令-如果检查失败,则只需从任务返回
    ,这将为检查逻辑提供多线程
  • 我真的看不出有任何理由坚持以一种艰难而混乱的方式来完成它,包括重写执行器、阻塞队列、预实例化线程以及可能的其他黑客行为
  • ThreadPoolExecutor不负责决定是否执行已提交的任务,而是任务提交者的责任,或者任务本身可能包含这样的逻辑,决定在不进行太多处理的情况下提前完成
  • (1) 这些是异步处理。如果检查失败,我不想丢弃项目,但我想让它们排队等待一段时间并尝试处理。(2) 我将不得不在循环中执行检查(忙等待),所有活动线程都将在忙等待中执行检查。调度到队列并从队列中使用它,只会使线程池的调度程序线程执行检查,作为其轮询的一部分,轮询在循环中运行,无限轮询队列。注意:我的检查对所有任务都是一样的(比如,检查所有任务通用的底层资源的运行状况)。方法runWorker()有一个复杂的逻辑,但是它调用getTask(),这个方法在队列上阻塞,直到它返回某个任务为止,从队列返回null将停止工作程序-您假定为其他。这不是个好主意,我怎么能告诉你?请不要让你的生活或其他与你一起工作的开发人员的生活成为噩梦——这段代码会让你非常痛苦。相反,请思考如何使用现有的标准机制来实现您的目标。要获得灵感,请阅读一本书《Java并行实践》。