一、什么是线程池,线程池有什么好处?
线程池:管理线程的池子,可以容纳多个线程,线程池里面的线程可以省区反复创建的过程
好处:
1、降低资源的消耗,可以通过重复利用创建线程和销毁的所带来的消耗
2、提高响应的速度,因为线程已经创建好了的,任务到达之后不需要进行创建线程,可以立即执行
3、提高线程的管理性,线程是稀缺资源,如果无限制的创建,会消耗系统的资源,还会降低系统的
稳定性,所以需要进行统一管理、分配和方便优化。
二、常见的几种线程池?
1、定长线程池(FixedThreadPool)
2、定时线程池(ScheduledThreadPool)
3、可缓存线程池(CachedThreadPool)
4、单线程化线程池(SingleThreadExecutor)
相同点:
四个线程池的本质是:ThreadPoolExecutor对象
不同点:
1、FixedThreadPool:只有核心线程数,线程数量是固定的,用完立即回收,任务队列为链表结构的有界队列
2、ScheduledThreadPool:核心线程数量是固定的,非核形线程数量是无限的,在执行完成后,闲置10ms后就会被回收,任务队列为阻塞队列
3、CachedThreadPool:无核心线程数,非核心线程数无限,执行完后60s秒被回收,
4、SingleThreadExecutor:只有一个核心线程数,无非核心线程数,执行完立即回收,任务队列为链表结构的有界队列
三、线程池的主要参数
1、核心线程数:默认情况下,核心线程数一直存活,但是也会超时回收的
2、最大线程数:线程池里面能够容纳的最大线程数量,达到峰值后,新任务回阻塞
3、线程闲置超时时长:如果线程闲置超过所定时长,非核心线程会被回收,但是核心线程数也会被回收的。
4、任务队列
5、拒绝策略:达到线程最大数量的时候执行的包和策略
6、线程工厂:指定线程池创建线程的方法
7、keepAliveTime:超时的时间单位,
四、线程池的工作流程
假如核心线程数为5,最大线程数为10,任务队列为10
1、有新任务来,先使用核心线程来执行任务
2、当达到第5任务数时,第6个任务开始排队
3、当任务数达到15个时,第16个任务将开启新的线程执行,也就是第6个线程
4、当任务数达到20个的时候,线程池满了,如果有第21个线程到来,就执行拒绝策略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LS9l4rhs-1678693807299)(D:\HP\Documents\面试题01)]
五、线程池的拒绝策略有哪些?
1、AbortPolicy(默认):丢弃任务并且抛出异常
2、CallerRunsPolicy:由线程处理该任务
3、DiscardPolicy:丢弃任务,但是不抛出异常,这个一般结合实际,进行自定义的处理方式
4、DiscardOldestPolicy:丢弃队列的最早未处理的任务,重新执行任务
六、如何合理的设置核心线程数?
线程池核心线程数:
- CPU密集型(计算密集型):
- cpu核心线程数
- cpu核心线程数+1
- I/O密集型
- 核心线程数=2*cpu线程数
- 核心线程数=cpu核心数/(1-阻尼系数)
- 混合型任务(既有cpu密集型又有I/O密集型)
- 核心线程数=(线程等待时间/线程cpu时间+1)*cpu核心数
七、线程池优化
- 执行线程时,cpu已经高于60%,那么就需要把线程池的大小调小
- 执行线程时候,如果内存占比较满,需要把线程池的队列调小
- 如果cpu和内存都不足,那么可以采用线程的模式去数据库去分页查询处理数据
- 线程池的拒绝策略,当线程数大于线列的允许时,存入额外的内存当中,等待空闲时线程在进行处理
八、线程池的状态
- RUNNING:线程初始化状态,可以添加待执行的任务
- SHOWDOWN:线程池处于待关闭状态,不接受新任务只处理已经接收的任务
- SHOP:线程池立即关闭,不接受新任务,放弃队列里面还没有执行的任务并且中断正在执行的任务
- TIDYING:线程池自理状态
- TERMINATED:线程池终止状态
九、说说线程池里面submit(和 execute两个方法有什么区别?
submit()和execute()两个都是用来执行线程池的,但是使用execute()来执行是不能有返回值的,而使用submit()可以使用Future来接受线程池执行的返回值
面试题之线程池
最新推荐文章于 2024-07-02 01:08:34 发布
线程池是一种线程管理机制,能减少创建和销毁线程的开销,提高响应速度。常见的线程池包括FixedThreadPool、ScheduledThreadPool、CachedThreadPool和SingleThreadExecutor,各有不同的特性和应用场景。线程池的关键参数包括核心线程数、最大线程数、线程闲置超时时长等,合理的设置对性能至关重要。拒绝策略包括AbortPolicy、CallerRunsPolicy等,用于处理线程池饱和时的任务处理方式。文章还探讨了线程池的优化方法和状态转换过程。
摘要由CSDN通过智能技术生成