# 线程池 #
-- JAVA线程池原理详解(1)
-- JAVA线程池原理详解(2)
-- Java线程池总结
**线程池概述:**
*
在一个应用程序中,我们需要多次使用线程,这就需要多次创建并销毁线程。而创建并销毁线程的过程会消耗内存。内存资源在java中很重要,所以就有了线程池用来管理线程,同时也减少了内存的消耗。Java中已经提供了创建线程池的一个类:Executor。平常我们创建 线程池时,一般使用它的子类:ThreadPoolExecutor。
*
public ThreadPoolExecutor(
int corePoolSize, // 线程池中的核心线程数量。这几个核心线程,在没有用的时候,也不会被回收
int maximumPoolSize,//线程池中可以容纳的最大线程的数量
long keepAliveTime, //线程池中除了核心线程之外的其他线程最长可以保留的时间。因 为在线程池中,核心线程在无任务的情况下也不能被清除,非核心线程是有存活时间的,就是非核心线程可以保留的最长的空闲时间
TimeUnit unit,// 计算除了核心线程之外的其他线程最长可以保留的时间的一个单位
BlockingQueue<Runnable> workQueue, //等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)
ThreadFactory threadFactory, //创建线程的线程工厂
RejectedExecutionHandler handler一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务
......
)
**线程池实现原理:**
*
提交一个任务到线程池中,线程池的处理流程:
1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。
2、如果核心线程都在执行任务,线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。
3、如果工作队列满了,就会判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给拒绝策略来处理这个任务。
**handler的拒绝策略有四种:**
*
AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满
DisCardPolicy:不执行新任务,也不抛出异常
DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行
CallerRunsPolicy:直接调用execute来执行当前任务
**四种常见的线程池种类**
①newSingleThreadExecutor:单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n):固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用):可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor:大小无限制的线程池,支持定时和周期性的执行线程