线程池的工作原理可以概括为以下几个方面:
线程池状态
线程池有五种状态:运行状态(RUNNING)、待关闭状态(SHUTDOWN)、停止状态(STOP)、空状态(TIDYING)和终止状态(TERMINATED)。
线程池在创建后处于空状态,接受任务后进入运行状态,执行`shutdown()`方法后进入待关闭状态,执行`shutdownNow()`方法后进入停止状态。
线程池的重要属性
`corePoolSize`:核心线程数,即线程池中始终存在的线程数,即使没有任务执行也会保持这个数量。
`maximumPoolSize`:线程池允许的最大线程数。
`keepAliveTime`:非核心线程在空闲状态下的存活时间,超过这个时间后线程会被销毁。
`workQueue`:用于存储等待执行的任务队列。
`RejectedExecutionHandler`:当任务无法被接受时的处理策略,如抛出异常或丢弃任务。
线程池的工作流程
当有新任务提交到线程池时,线程池会首先判断核心线程池中的线程是否都在执行任务。
如果核心线程空闲或者还有核心线程未被创建,则创建一个新的工作线程来执行任务。
如果核心线程都在执行任务,任务会被放入工作队列中等待执行。
如果工作队列未满,新任务会被添加到队列中。
如果工作队列已满,且线程池中的线程数未达到最大值,则创建一个新的工作线程执行任务。
如果线程池中的线程数已达到最大值,且工作队列已满,则根据拒绝策略处理新提交的任务,如抛出异常或丢弃任务。
核心线程在任务执行完毕后不会立即销毁,而是挂起等待下一个任务。
非核心线程在任务执行完毕后,如果一段时间内没有被复用,则会被销毁。
通过这种方式,线程池可以有效地管理线程的创建和销毁,减少系统资源的消耗,并提高系统的响应速度