线程池的理解

线程池的理解

6.1. 对线程池的理解

线程池是一种池化技术,其实是一种资源复用思想的利用 常见的比如像线程池,连接池 内存池 对象池等这些

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最 大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。

主要特点:线程复用;控制最大并发数:管理线程。

第一:降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消耗。

第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进 行统一的分配,调优和监控

2. 线程池底层工作原理

第一步:线程池刚创建的时候,里面没有任何线程,等到有任务过来的时候才会创建线程。也可以调用 prestartAllCoreThreads() 或者 prestartCoreThread() 方法预创建corePoolSize个线程

第二步:调用execute()提交一个任务时,如果当前的工作线程数<corePoolSize,直接创建新的线程执行这个任务

第三步:如果当时工作线程数量>=corePoolSize,会将任务放入任务队列中缓存

第四步:如果队列已满,并且线程池中工作线程的数量<maximumPoolSize,还是会创建线程执行这个任务

第五步:如果队列已满,并且线程池中的线程已达到maximumPoolSize,这个时候会执行拒绝策略,JAVA线程池默认的策略是AbortPolicy,即抛出RejectedExecutionException异常

3. 线程池参数

corePoolSize核心线程数目 - 池中会保留的最多线程数
maximumPoolSize最大线程数目 - 核心线程+救急线程的最大数
keepAliveTime生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放
unit时间单位 - 救急线程的生存时间单位,如秒、毫秒等
workQueue当没有空闲核心线程时,新来任务会加入到此队列排队,队列满会创建救急线程执行任务
threadFactory线程工厂 - 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等
handler拒绝策略 - 当所有线程都在繁忙,workQueue 也放满时,会触发拒绝策略

4. 线程池拒绝策略

拒绝策略分类含义使用场景
AbortPolicy丢弃任务并抛出异常 RejectedExecutionException我们项目中关于线程池的定义,使用的就是默认的如果这种需求是关键的业务,eg:商品详情/购物车/首页
DiscardPolicy安静的丢弃任务但是不抛出异常设计的时候,一些无关紧要的业务可以采用此策略Eg:单纯的展示某一项数据的情况 文章的浏览量/点赞个数
DiscardOldestPolicy丢弃队列最前面的任务,然后重新提交被拒绝的任务喜新厌旧使用场景不多,可根据特定场景使用
CallerRunsPolicy由调用线程处理该任务使用场景非常少
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值