面试题之线程池

线程池是一种线程管理机制,能减少创建和销毁线程的开销,提高响应速度。常见的线程池包括FixedThreadPool、ScheduledThreadPool、CachedThreadPool和SingleThreadExecutor,各有不同的特性和应用场景。线程池的关键参数包括核心线程数、最大线程数、线程闲置超时时长等,合理的设置对性能至关重要。拒绝策略包括AbortPolicy、CallerRunsPolicy等,用于处理线程池饱和时的任务处理方式。文章还探讨了线程池的优化方法和状态转换过程。
摘要由CSDN通过智能技术生成
一、什么是线程池,线程池有什么好处?

线程池:管理线程的池子,可以容纳多个线程,线程池里面的线程可以省区反复创建的过程

好处:

​ 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来接受线程池执行的返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个胖小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值