线程池,就是存放线程的池子,池子里存放了很多可以复用的线程
作用:
1.对线程进行统一管理
2.降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗
3.提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行
4.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗大量系统资源,还会降低系统的稳定性,使用线程池可以进行对线程进行统一的分配、调优和监控
七大参数:
1.核心线程数
2.最大线程数
3.线程空闲时的存活时间
4.线程空闲时的存活时间的时间单位
5.任务缓存队列,用来存放等待执行的任务
6.线程工厂,创建新线程时使用的线程工厂
7.任务拒绝策略
当阻塞队列满了,且线程池中的线程数达到maximumPoolSize,如果继续提交任务,就会采取任务拒绝策略处理该任务,线程池提供了4种任务拒绝策略:
* AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;
* CallerRunsPolicy:由调用execute方法的线程执行该任务;
* DiscardPolicy:丢弃任务,但是不抛出异常;
* DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)
常用的线程池
1.newFixedThreadPool线程池 (固定大小线程池)
由参数可知 核心线程 和额外线程值是相同的,额外线程被回收时间是0,采用的是无界队列。默认采用的拒绝策略为AbortPolicy。分析得 核心线程和额外线程处理不过来得情况,会一直往队列里面放任务
可能存在的问题:队列过大 导致内存溢出 OOM
2.将额外线程设置成最大
当任务量足够大,超过队列。交由额外线程处理。就会创建过多线程
可能存在问题:特殊场景下,线程过多可能会导致系统奔溃。cpu负载过高