1. 单线程线程池 newSingleThreadExecutor
线程池只有一个线程在工作,单线程串行执行所有任务,如果异常,按照提交顺序选择新线程继续执行。
2. 可缓存的线程池 newCachedThreadPool
调用execute将重用以前构造的线程,线程不可用才创建新线程,60s未使用会被移除。
3. 固定大小的线程池 newFixedThreadPool
可以指定同时访问的线程数量,源码创建了指定大小的LinkedBlockingQueue的线程池
4. 线程池的好处
降低资源消耗,提高响应速度,提高线程可管理性,防止服务器过载CPU耗尽。
5. 线程使用范围
单个任务小,任务数量大,要求响应速度大,突发性的大量客户请求。
6. 线程池工作机制及原理
核心队列:线程等待池(BlockingQueue);任务处理池(正在工作的Thread列表)。
线程池核心参数:核心池大小(corePoolSize):固定大小后,线程池的稳定峰值达到这个值后,池的线程数大小不会释放。
最大处理线程池数(maximumPoolSize):当池里的线程数在核心池大小和最大处理线程池数之间可以动态创建与回收线程池里面的线程的资源。
corePoolSize为线程池的大小,类似正式工人,maximumPoolSize更像是一种补救措施,类似临时工人。
7. 自定义线程池与ExecutorService
7.1 ExecutorService 主要元素:
7.2 RejectedExecutionHandler处理丢弃线程的异常处理接口
线程池任务拒绝策略:
AbortPolicy:直接抛出异常;
CallerRunsPolicy:只用调用者所在线程来运行任务;
DiscardOldestPolicy:丢弃队列里最近的一个任务,执行当前任务;
DiscardPolicy:不处理,丢弃。
7.3 ThreadPoolExecutor线程池核心类
共有4个构造器,构造器参数详解:
int corePoolSize:核心池大小,在任务没有到来之前创建coorPoolSize个线程或者一个线程。默认情况下创建线程池后有0个线程,当达到corePoolSize个线程数后将到达的任务放在缓存队列中。
int maximumPoolSize:线程池最大线程数。
long keepAliveTime:线程池没有任务时最多保持多久才终止。默认情况下线程数大于corePoolSize时才起作用。
TimeUnit unit:参数keepAliveTime的时间单位。
BlockingQueue workQueue:阻塞队列,用来存储等待执行的任务。(ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue)。
ThreadFactory threadFactory:线程工厂,用来创建线程,默认Executors.defaultThreadFactory()。
RejectedExecutionHandler handler:表示当拒绝处理任务时的策略。(ThreadPoolExecutor.AbortPolicy-默认;ThreadPoolExecutor.DiscardPolicy;ThreadPoolExecutor.DiscardOldestPolicy;ThreadPoolExecutor.CallerRunsPolicy)
8. 线程池使用时需要注意的几点
8.1 不要在services方法里创建线城池,每次方法调用将会创建一堆线程池。
8.2 合理设置线程池数量,可以指出服务器暂时很忙的相应来拒绝请求。
8.3 注意死锁