目录
一、线程池的定义
线程池是一种用于管理和复用线程的机制。它是在并发编程中常用的设计模式之一,可以提高线程的利用率并降低线程创建和销毁的开销。线程池维护一定数量的线程,并根据需要从线程池中获取线程来执行任务,执行完任务后线程会被返还给线程池以供下次使用。
二、线程池的优点
- 减少资源的消耗:通过使用线程池可以很大程度上避免线程的频繁创建、销毁等管理操作,并且可以更加充分的发挥线程的价值;
- 响应任务的速度提高:线程池减少了线程的创建时间以及一些别的操作,可以更快的接受并执行任务;
- 有效管理和控制线程:线程池可以根据需求和系统负载情况合理调整线程的数量。可以设定线程池的最大线程数来限制并发线程的数量,避免过多线程导致系统资源耗尽或性能下降。线程池还提供了对线程的管理和监控,可以对线程进行统一的管理、监控和调度,提高了线程执行的可控性;
- 提供任务队列和调度策略:线程池通常配备一个任务队列用于存放等待执行的任务。通过任务队列,可以缓冲和控制任务的执行,合理调度线程的执行顺序和频率。线程池还可以根据任务队列中的任务数量和线程池的配置来动态调整任务的执行策略,确保任务能够按照一定的调度算法得到执行;
- 提高线程的复用性和可管理性:线程池能够将线程的创建和销毁等细节进行封装和管理,对外提供一个简单的接口供任务提交和执行。通过使用线程池,可以更方便地管理和控制线程的生命周期,提高线程的复用性和可管理性。
三、线程池的执行流程
当一个线程池被创建后,它的主要执行流程如下:
线程池的执行从收到线程任务开始,当线程任务被提交后,线程池首先查看自身是否有空闲线程,若存在空闲线程,则将该线程分配给提交的任务;如果线程池无空闲线程,则判断自身持有的线程数是否小于核心线程数,如果小于核心线程数,则创建一个线程并分配给提交的任务;如果线程池内持有的线程数超出了核心线程数,则优先将任务存入等待队列中等待执行;如果等待队列已满,则判断当前线程池所持有的线程数是否小于最大线程数,如果小于,则创建线程,并执行该任务;如果当前等待队列已满且持有线程数超出核心线程数,则实行拒绝策略。
四种拒绝策略
- AbortPolicy(默认策略):如果线程池已满,无法接受新任务时,会抛RejectedExecutionException异常,拒绝新任务的提交。
- CallerRunsPolicy:如果线程池已满,无法接受新任务时,该策略会直接在调用线程中执行新任务。
- DiscardPolicy:如果线程池已满,无法接受新任务时,该策略会默默地丢弃被拒绝的任务,不会有任何异常抛出。
- DiscardOldestPolicy:如果线程池已满,无法接受新任务时,该策略会丢弃线程池中最早被放入等待队列的任务,然后尝试再次提交新任务。
四、线程池的状态
线程池在运行过程中可以处于不同的状态,这些状态反映了线程池的当前状态和运行情况。下面是常见的线程池状态:
-
Running(运行状态):线程池处于正常运行状态,可以接收任务并执行。
-
Shutdown(关闭状态):线程池停止接收新的任务,但会继续执行已经提交的任务。已经在执行的任务不受影响。线程池处于正在关闭的状态。
-
Stop(终止状态):线程池停止接收新的任务,同时会中断正在执行的任务,并将未执行的任务从任务队列中移除。线程池处于已经终止的状态。
-
Tidying(整理状态):线程池处于整理状态时,会尝试回收没有工作线程的线程池资源。当线程池中的活动线程数量为零时,会转换到整理状态。
-
Terminated(终止状态):线程池已经完全终止,不再接收任务,所有的线程都已经执行完毕。