线程池的 “神秘” 参数 corePoolSize
在 Java 并发编程的领域中,线程池是一个强大的工具,它能帮我们高效地管理线程,提升程序的性能和响应速度。而ThreadPoolExecutor作为线程池的核心实现类,提供了丰富的参数配置,其中corePoolSize(核心线程数)是一个关键参数,它就像线程池的 “基石”,对线程池的性能和资源利用有着深远的影响。今天,我们就来深入探讨一下,如果把线程池的corePoolSize设置为 0,会出现怎样的情况。
理论分析:常规线程池工作流程对比
在探讨corePoolSize为 0 的情况之前,我们先来回顾一下常规线程池的工作流程。当一个任务提交到线程池时,线程池会按照以下步骤进行处理:
-
核心线程优先:线程池首先会检查当前正在运行的线程数是否小于
corePoolSize。如果小于,就会创建一个新的核心线程来执行这个任务。这就好比一家餐厅,有一些固定的服务员(核心线程),当有顾客(任务)进来时,首先会安排这些固定服务员去服务。 -
队列缓冲:如果当前正在运行的线程数已经达到或超过
corePoolSize,那么任务会被放入任务队列(workQueue)中等待执行。就像餐厅的固定服务员都在忙,新进来的顾客就需要在候餐区(任务队列)等待。 -
最大线程扩展:如果任务队列也已满,这时线程池会检查当前正在运行的线程数是否小于
maximumPoolSize(最大线程数)。如果小于,就会创建新的非核心线程来执行任务。这类似于餐厅在顾客过多,候餐区也满了的情况下,临时招聘一些兼职服务员(非核心线程)来帮忙。 -
拒绝策略:如果线程池中的线程数已经达到
maximumPoolSize,并且任务队列也已满,那么新提交的任务就会被拒绝,线程池会根据设置的拒绝策略来处理这些被拒绝的任务。比如餐厅已经满员,连临时服务员都用上了,再有新顾客来就只能拒绝接待。常见的拒绝策略有AbortPolicy(直接抛出异常)、CallerRunsPolicy(由提交任务的线程来执行任务)、DiscardOldestPolicy(丢弃队列中最旧的任务,并尝试执行当前任务)和DiscardPolicy(直接丢弃当前任务,不予处理) 。
而当corePoolSize被设置为 0 时,整个任务处理逻辑就发生了变化。此时线程池没有核心线程,任务提交时,不会直接创建核心线程去执行任务。而是直接尝试将任务放入任务队列。如果任务队列满了,才会根据maximumPo

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



