线程池执行流程主要涉及到以下几个关键组件:核心线程数、任务队列、最大线程数以及拒绝策略等。以下是线程池的工作流程详解:
创建线程池:
当我们创建一个线程池时,需要指定几个核心参数,如corePoolSize
(核心线程数)、maximumPoolSize
(最大线程数)、keepAliveTime
(非核心线程空闲时间)、workQueue
(任务队列)和RejectedExecutionHandler
(拒绝策略)等。
提交任务:
当调用execute(Runnable task)
方法提交一个任务时,线程池会按照以下顺序处理:
a. 首先检查线程池中当前运行的线程数是否小于corePoolSize
,如果是,则创建一个新的工作线程来执行任务,即使其他工作线程是空闲的。
b. 如果线程池中的线程数已经达到corePoolSize
,则将新提交的任务放入workQueue
(阻塞队列)中排队等待。
c. 如果workQueue
已满,且线程池中的线程数量仍小于maximumPoolSize
,那么会继续创建新的线程来执行任务。
d. 若线程池中的线程数量已经达到maximumPoolSize
,同时workQueue
也已满,无法再添加新任务时,将根据指定的RejectedExecutionHandler
策略来处理该任务,例如抛出异常或者直接丢弃任务。
线程管理:
当线程池中的线程数量超过corePoolSize
时,如果某一线程空闲时间超过keepAliveTime
,则会被终止,以减少资源消耗。但只要线程池中的线程数量大于等于corePoolSize
,就不会因为线程空闲而被终止。
为何要这样设计: