一、线程池优势:
1、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁的消耗。
2、提高响应速度,当任务到达时,任务可以不需要等待线程创建就能立即执行。
3、提高线程的可管理性,可以进行统一的分配,调优和监控。
二、线程池七大参数
1、corePoolSize:线程池中的常驻核心线程数。
2、maximumpoolSize:线程池能够容纳同时执行的最大线程数。
3、keepAliveTime:多余的空闲线程的存活时间。
当前线程池数量超过corePoolSize时,当空闲十几件达到keeepAliveTime时,多余的空闲线程会被销毁知道只剩下corepoolSize个线程为止。
4、unit:keepAlivetime的单位
5、woreQueue:任务队列,被提交但尚未被执行的任务。
6、threadFactory:表示生成线程中工作线程的线程工厂,用于创建线程,一般为默认。
7、handler:拒绝策略,表示当队列满了并且工作线程数达到最大线程数时如何拒绝新的任务。
有四种拒绝策略:
a、aborepolicy(默认):直接抛出rejectedExcutionException异常,阻止系统正常运行该任务。
b、CallerRunsPolicy:调用者运行 一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将任务退回给调用者
c、DiscareOldestPolicy:抛弃队列中等待最久的任务,然后将当前任务尝试加载到队列中再次提交当前任务。
d、DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。
三、线程池底层运行原理:
1、在创建了线程池后,等待提交过来的任务请求。
2、当调用execue()方法添加一个请求任务后,线程池会做如下判断:
2.1 如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务。
2.2 如果正在运行的线程数量大于或者等于corePoolSize,那么将这个任务放入队列。
2.3 如果这时候队列满了且正在运行线程数量小于 maximunPoolSize,那么还是要创建非核心线程数立即运行执行队列任务。
2.4 如果对垒满了且正在运行的线程数量大于或者等于maximumPoolSize,那么线程池启动饱和策略。、
3、当一个线程完成任务是,他会从对列取下一个任务继续来执行。
4、当一个线程停下且超出一定的时间(keepAliveTime),线程池会判断:
如果当前运行的线程数量大于corePoolSize,那么这个线程就会被停掉。
所以线程池的所有任务完成后他最终会收缩到corePoolSize的大小。
四、线程池配置
1、cup密集型:一般配置和cpu核数相等或者大于1、
2、io密集型:a、可以配置cpu核数*2’
b、线程数 = cpu核数 /1 - 阻塞系数 阻塞系数一般为0.8~0.9 一般取0.9