Skip to content

线程池核心参数有什么,拒绝策略有什么

核心参数

在Java的ThreadPoolExecutor类中,定义了线程池的七个核心参数。

  1. corePoolSize (核心线程数):线程池中长期存活的线程数量。即使这些线程处于空闲状态,它们也不会被回收(除非设置了allowCoreThreadTimeout)。当新任务提交时,如果当前运行的线程数少于corePoolSize,线程池会创建一个新线程来处理任务。

  2. maximumPoolSize (最大线程数):线程池能够容纳的最大线程数量。当工作队列已满,并且当前运行的线程数小于maximumPoolSize时,线程池会创建新的非核心线程来处理任务。

  3. keepAliveTime (空闲线程存活时间):非核心线程的空闲存活时间。当线程池中的线程数量超过corePoolSize时,如果一个非核心线程的空闲时间超过了keepAliveTime,它将被终止和回收,以释放资源。

  4. unit (时间单位):用于指定keepAliveTime的时间单位,例如秒、毫秒等。

  5. workQueue (工作队列):用于存放等待执行的任务的阻塞队列。当核心线程都在忙碌时,新提交的任务会被放入这个队列中排队。常用的队列类型包括ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue等。

  6. threadFactory (线程工厂):用于创建新线程的工厂。通过自定义线程工厂,可以为线程设置有意义的名称、指定为守护线程或设置线程优先级等。

  7. rejectedExecutionHandler (拒绝策略):当线程池和工作队列都已满,无法处理新提交的任务时所采取的策略。

拒绝策略

当线程池无法接受新任务时,会触发拒绝策略。这通常发生在两种情况下:线程池被关闭后再次提交任务,或者线程池的工作负荷已达到饱和状态。 ThreadPoolExecutor 提供了四种内置的拒绝策略:

  1. AbortPolicy (默认策略):这是默认的拒绝策略。当任务被拒绝时,会直接抛出RejectedExecutionException异常,从而中断调用者的执行。 这种策略能够明确地让调用方知道任务提交失败。

  2. CallerRunsPolicy (调用者运行策略):该策略不会抛弃任务,也不会抛出异常,而是将任务回退给调用者线程来执行。 这样做可以降低新任务的提交速度,因为提交任务的线程自身需要执行任务,从而为线程池争取处理已有任务的时间。

  3. DiscardPolicy (丢弃策略):当新任务无法被线程池接收时,该策略会默默地丢弃这个任务,不做任何处理,也不会抛出任何异常。 在任务不重要且可以被丢弃的场景下可以使用此策略。

  4. DiscardOldestPolicy (丢弃最旧任务策略):此策略会丢弃工作队列中等待时间最长的任务(即队头的任务),然后尝试将新提交的任务重新加入队列。 这种策略适用于那些希望优先处理最新任务的场景。