一、什么是线程池
线程池是一种管理和复用线程的机制,线程池内部维护了若干个线程。
没有线程任务时,这些线程都处于等待状态,如果有线程任务时,就分配一个空闲的线程执行。如果所有的线程都处于忙碌状态,线程池就会创建一个新的线程执行任务或者放入工作队列中排队等待。
二、线程池的执行流程
-
提交一个新的线程任务,如果存在空闲线程,线程池就会分配一个空闲的线程用来执行线程任务。
如果没有空闲线程?判断存活的线程数是否超过核心线程数,如果存活的线程数没有超过核心线程数,创建核心线程数执行线程任务。
-
如果存活的线程数超过了核心线程数,判断工作队列是否已满?如果未满,将线程任务存放到工作队列中等待空闲线程执行工作队列中的线程任务。
-
如果工作队列满了 ,判断存活的线程数是否超过最大线程数,未超过最大线程数,创建非核心线程数执行线程任务,如果存活的线程数超过了最大线程数,执行拒绝策略。
执行顺序:核心线程、工作队列、最大线程数、拒绝策略
三、线程池的优点
线程池是一种管理和复用线程的机制,具有以下优点:
- 降低资源消耗:线程池可以避免频繁创建和销毁线程的开销。通过预先创建一定数量的线程并将它们保存在线程池中,可以重复利用这些线程来处理多个任务,减少了线程创建和销毁的开销。
- 提高响应速度:线程池可以并发执行多个任务,当有新任务到达时,可以立即从线程池中获取可用线程进行处理,而不需要等待线程的创建。
- 控制并发线程数:线程池可以限制系统中并发线程的数量,防止无限制地创建线程导致系统资源耗尽的问题。通过合理配置线程池的大小,可以控制系统的并发度,避免因过多线程而引起的性能下降、内存溢出问题。
四、线程池的状态
线程池的状态分为运行状态、关闭状态、停止状态、整理状态、终止状态
Running:运行状态,线程池一旦被创建,就处于运行状态。
调用shutdown()方法,切换到关闭状态;调用shutdownNow()方法,切换到停止状态。
shutdown:关闭状态,关闭状态的线程池不会接收新的线程任务,但会处理工作队列中的线程任务。
stop:停止状态,停止状态的线程池不会接受新的线程任务,也不会处理工作队列中的线程任务,还会中断正在执行的线程任务。
tidying:整理状态,表明所有的线程任务都已经运行终止。
terminated:终止状态:线程池彻底关闭