ExecutorService
(具有服务生命周期的Executor)
是一个接口,用于执行线程的服务,有两个具体的实现类
ScheduledThreadPoolExecutor, ThreadPoolExecutor
ExecutorService的生命周期:
ExecutorService有3种生命状态 运行,关闭,终止
ExecutorService创建时,处于运行状态
调用shutdown()处于关闭状态 (关闭状态时,已经被添加的方法仍会继续执行) isShutDown()返回true
调用shutdownNow()或者所有添加的线程执行完毕时,处于终止状态 isTerminate()返回true
ThreadPoolExecutor 构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
参数解释:
corePoolSize 线程池中维护的最少的线程数量,没有任务也会一直存活
maximumPoolSize 线程池中线程的最大数量
keepAliveTime 线程数量>corePoolSize 时,线程完成后,该线程回收的最大空闲时间
workQueue 线程池所使用的缓冲队列,通常为LinkedBlockingQueue
ThreadFactory 创建线程的工厂(接口,覆盖
newThread(Runnable r)方法,返回一个自定义的Thread
)
handler当线程数量大于maximumPoolSize时,拒绝任务的处理策略,默认ThreadPoolExecutor.AbortPolicy()
ThreadPoolExecutor对象调用 execute(Runnable) 方法 来执行一个线程
ThreadPoolExecutor
对象可以由Executors类的静态方法获得,如下
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
newFixedThreadPool使用了有限的线程集来提交所执行的任务,直接从线程池中获取线程.
newCachedThreadPool线程池中corePoolSize为0,在需求中创建于所需数量相同的线程,然后回收时最大空闲时间为60s
newSingleThreadExecutor 就是线程数量为1的
FixedThreadPool,如果提交了多个任务,这些任务将排队
ThreadPoolExecutor添加任务时的具体过程:
运行的线程数量小于
corePoolSize时,添加并执行线程 继续添加Task....
等于
corePoolSize时,放入workQueue
继续添加Task....
>
corePoolSize
workQueue已经放满
线程数量小于
maximumPoolSize.创建新线程执行
继续添Task....
>
corePoolSize
workQueue已经放满
maximumPoolSize也装满,新提交任务由Handler处理
(构造方法的最后一个参数)
Task未新添加...渐渐执行完毕
多余线程空闲时间超过keepAliveTime时,会关闭这部分线程,直到线程数量为
corePoolSize
BlockingQueue 常用下面几种
SynchronousQueue (默认)直接提交线程,
直接提交通常要求无界maximumPoolSizes 以避免拒绝新提交的任务
LinkedBlockingQueue 无界队列,
将导致在所有 corePoolSize 线程都忙时新任务在队列中等待,创建的线程就不会超过 corePoolSize,maximumPoolSize的值也就无效了
ArrayBlockingQueue 有界队列,很难控制,队列大小和
maximumPoolSizes要相互折中
RejectedExecutionHandler 有下面4种
ThreadPoolExecutor.AbortPolicy
抛出异常java.util.concurrent.RejectedExecutionException (和线程抛出异常不同,这个异常会影响到主线程)
ThreadPoolExecutor.CallerRunsPolicy
ThreadPoolExecutor来重试执行当前任务
ThreadPoolExecutor.DiscardOldestPolicy
取缔掉线程池中最后一个要执行的任务
,并执行新传入的任务
ThreadPoolExecutor.DiscardPolicy
不做任何动作