线程池:
为了降低资源消耗,避免来一个任务就创建一个线程
提高响应速度,任务到达无需执行创建线程操作,直接获取执行
增加线程的管理性,线程是稀缺资源,使用线程池方便管理以及监控调优
线程池的五种状态:
RUNNING:接收新任务并处理排队任务
SHUTDOWN:不接受新任务,但处理排队任务
STOP:不接受新任务,不处理排队任务,并终断正在进行的任务
TIDYING:所以任务都已终止,
TERMINATED:TIDYING执行terminated()后进入此状态
七大核心参数:
核心线程数;
最大线程数;
非核心线程存活时间;
存活时间单位;
任务队列;
线程工厂;
拒绝策略。
线程池执行流程:
提交任务,判断核心线程数是否已经满了,未满就创建一个核心线程执行当前任务,已满,就将任务加到任务队列(FIFO)中等待,任务队列满了就判断非核心线程是否已满,未满就创建一个非核心线程执行当前任务,非核心线程满了就执行对应的拒绝策略
怎样设置核心线程以及最大线程数:
根据任务类型,cpu密集型则一般是cpu核数加一,(加一的原因是为了避免系统原因导致某一线程挂掉之后导致无线程可用,使得某一核空闲),如果是IO密集型,那么一般为cpu核数*2,但是更准确的为cpu核数*(1+ IO执行时间/线程执行时间)
最大核心线程数一般需要通过测试和压力测试确定
七大核心参数之任务队列:
ArrayBlokingQueue:一个基于数组结构的有界阻塞队列,按照先进先出对任务进行排序;
LinkedBlockQueue:基于链表结构的有界/无界阻塞队列,按FIFO进行任务排序,吞吐 量大于ArrayBlockingQueue
使用队列需要注意两个点,一就是选择合适的拒绝策略,第二就是使用无界队列时注意任务提交速度大于线程池的处理速度,那么会导致内存溢出
七大核心参数之拒绝策略:
AbortPolicy:中止策略,默认的拒绝策略,会直接抛出一个异常,调用者可以根据这个异常修改自己的代码
DiscardPolicy:抛弃策略,什么都不做,直接抛弃被拒绝的任务
一般来说是来任务了才会去创建线程,但是也可以使用prestartCoreThread或者prestartAllCoreThread提前创建一个或者全部核心线程
常见的线程池:
newFixedThreadPool:固定线程数的线程池,核心线程等于最大线程,使用的是无界LinkedBlockingQueue。适用于负载过重的服务器
NewSingleThreadExecutor:只有一个线程的线程池,就是核心线程为一,非核心线程为0,适用于需要保证顺序的执行各个任务
NewCachedThreadPool:没有核心线程,只有非核心线程,存活时间是60秒,