线程池执行流程主要涉及到以下几个关键组件:核心线程数、任务队列、最大线程数以及拒绝策略等。以下是线程池的工作流程详解:
-
创建线程池:
当我们创建一个线程池时,需要指定几个核心参数,如corePoolSize
(核心线程数)、maximumPoolSize
(最大线程数)、keepAliveTime
(非核心线程空闲时间)、workQueue
(任务队列)和RejectedExecutionHandler
(拒绝策略)等。 -
提交任务:
当调用execute(Runnable task)
方法提交一个任务时,线程池会按照以下顺序处理:a. 首先检查线程池中当前运行的线程数是否小于
corePoolSize
,如果是,则创建一个新的工作线程来执行任务,即使其他工作线程是空闲的。b. 如果线程池中的线程数已经达到
corePoolSize
,则将新提交的任务放入workQueue
(阻塞队列)中排队等待。c. 如果
workQueue
已满,且线程池中的线程数量仍小于maximumPoolSize
,那么会继续创建新的线程来执行任务。d. 若线程池中的线程数量已经达到
maximumPoolSize
,同时workQueue
也已满,无法再添加新任务时,将根据指定的RejectedExecutionHandler
策略来处理该任务,例如抛出异常或者直接丢弃任务。 -
线程管理:
当线程池中的线程数量超过corePoolSize
时,如果某一线程空闲时间超过keepAliveTime
,则会被终止,以减少资源消耗。但只要线程池中的线程数量大于等于corePoolSize
,就不会因为线程空闲而被终止。
为何要这样设计:
- 核心线程:保证在有任务提交时,能够立即得到执行,提高响应速度。
- 任务队列:当核心线程都在工作时,新任务可以在队列中等待,避免频繁地创建销毁线程带来的开销。
- 最大线程:限制系统资源占用,防止因任务过多导致系统资源耗尽。
- 拒绝策略:在极端情况下,提供一种应对机制,避免无限制地创建线程引发的问题。