1 谈谈你对线程池理解
1 概念
线程池是一种用于管理线程的机制,核心思想是资源复用,避免频繁地创建和销毁线程所带来的性
能开销。
2 原理
线程池的原理是预先创建一定数量的线程,并将它们放入一个线程池中。当有任务需要执行时,从
线程池中取出一个空闲线程来执行该任务,如果所有线程都在忙,则任务会被放入队列中等待
2 自定义线程池参数以及每个参数设置了多少
JUC的工具类也会提供一些实例化线程池的方法,但是我们项目中并没有使用,因为都会有潜在的OOM风险,所以我们是对这些参数做了定制,具体是这样的
corePoolSize(核心线程数):
cpu+1 这个参数要根据具体的服务器配置来定
maximumPoolSize (救急线程):
cpu核数*2 这个参数我们考虑到能够对任务处理最大化,设置的都比较大
keepAliveTime (救急线程过期时间):
60
TimeUnit(时间单位):
一般是s
ThreadFactory(线程工厂) :
我们项目采用的默认提供的
BlockingWorkQueue (阻塞队列) :
这个参数首光要保证的有界,其次,再根据是否有对执行有效有更高要求的场景
如果有,采用ArrayBlockingQueue反之采用LinkedBlockingQueue
RejectedExecutionHandler(拒绝策略):
我们一般用AbortPolicy拒绝并抛出异常其实就是考虑到一旦日志中检测到了拒绝执行异常的时候,及时动态调整其他参数
3 线程池执行逻辑
线程池创建,准备好 corePoolSize(核心线程数量)的线程,准备接收任务。
新的任务进来,用core准备好的空闲线程执行
若核心线程满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行。
阻塞队列满了,就直接开新线程执行,最大只能开到maximumPoolSize最大核心线程数指定的数量
若最大线程数量满了,就交给拒绝策略去处理。
4 拒绝策略有几种?
AbortPolicy (终止策略):,丢弃任务,并抛出异常。(jdk默认策略)
DiscardPolicy (丢弃策略):丢弃任务,不抛出异常
DiscardOldestPolicy(弃老策略):丢弃队列最前面的任务,然后重新执行任务
CallerRunsPolicy (调用方策略): 既不丢弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者去执行它