线程池简介
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程池包括以下四个基本组成部分:
1. 线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2. 工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等
4. 任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
继承体系
线程池所涉及到的类和接口并不是很多,其集成体系也比较简单,相关继承关系如下:
如上图,最顶层的接口Executor仅仅声明了一个方法executor.ExecutorService接口在其父类接口的基础上,声明了包含但不限于shutdown
,submit
,invokeAll
,invokeAny
等方法.至于ScheduledExecutorService接口,则是声明了一些和定时任务相关的方法.比如schedule
和scheduleAtFixedRate
.线程池的核心实现是在ThreadPoolExecutor
类中.我们使用Executors
调用newFixThreadPool
,newSingleThreadExecutor
和newCacheedThreadPool
等方法创建的线程池均是ThreadPoolExecutor
类型.
原理分析
核心参数分析
线程池的核心实现即ThreadPoolExecutor
类.该类包含了几个核心的属性,这些属性可在构造方法进行初始化.在介绍核心属性前,可以先看看ThreadPoolExecutor
的构造方法,如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
构造方法的参数即核心参数,这里我用一个表格来简要说明一下各个参数的意义。如下:
参数 | 说明 |
---|---|
!corePoolSize | 核心线程数。当线程数小于该值时,线程池会优先创建新线程来执行新任务 |
maximumPoolSize | 线程池所能维护的最大线程数 |
keepAliveTime | 空闲线程的存活时间 |
workQueue | 任务队列,用于缓存未执行的任务 |
threadFactory | 线程工厂。可通过工厂为新建的线程设置更有意义的名字 |
handler | 拒绝策略。当线程池和任务队列均处于饱和状态时,使用拒绝策略处理新任务。默认是 AbortPolicy,即直接抛出异常 |