线程池的构造方法:
public ThreadPollExecutor(int corePoolSize//核心线程数量
int maximumPoolSize//最大线程数量
long keepAliveTime//最大空闲时间
TimeUnit unit//时间单位
BlockingQueue<Runnable> workQueue//任务队列
ThreadFactory threadFactory//线程工厂
RejectedExecutionHandler handler//饱和处理机制)
scheduled :安排;为…安排时间;预定;
newCachedThreadPool:没有核心线程,队列为同步队列:只有一个队列,如果没用使用此队列,不会产生新的队列,有几个Task,就有几个线程,线程数量过多,只会导致内存占用100%,不会导致内存溢出
newFixedThreadPool:最大线程数量与核心线程数量相同:队列为无界队列
newsigleThreadPool:最大线程数量等于核心线程数量等于1:队列为无界队列
为什么要使用线程池
、减少开销提升效率
减少线程的创建和销毁所花的时间以及系统资源的开销;
同时,提高系统响应速度,当有新任务到达时,通过复用已存在的线程,无需等待新线程的创建便可立即执行。
2、提高线程的可管理性
方便管控线程并发数量。线程无限制的创建,可能会导致内存占用过多,从而产生OOM,并且会造成CPU过度切换,CPU切换线程是有时间成本的:需要保持当前执行线程的现场,并恢复要执行线程的现场。
对线程进行统一的分配、调优和监控,从而也提高响应速度;提供更强大的功能,延时定时线程池。
为什么不推荐使用java自带的线程池工具类?
OOM(内存溢出):只有newCachedThreadPool 不会出现OOM:问题出现在了队列上,队列的本质是数据结构,数据结构的本质是用来存储的
提交优先级:核心线程---队列--非核心线程
执行优先级:核心线程--非核心线程---队列