1.ThreadPoolExecutor的7个参数
(1)corePoolSize核心线程数:
默认核心线程会一直存活,即使闲置也不会受keepAliveTime的影响,除非将allowCoreThreadTimeOut设置为true;
(2)maximumPoolSize最大线程数:
超过这个数的线程将被阻塞,当任务队列为没有设置大小的LinkedBlockingQueue时,此值无效;
(3)keepAliveTime活跃时间: 非核心线程的闲置超时时间;
(4)unit单位:指定keepAliveTime的单位;
(5)workQueue任务队列:
常见的有三种:SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue(下文具体介绍)
(6)threadFactory线程工厂:提供创建新线程的功能;
(7)rejectedExecutionHandler拒绝执行操作:
当任务队列已满,线程池中的资源已经全部被使用,新建线程又被拒绝时,会调用RejectedExecutionHandler
的rejectedExecution方法。
2.三种常见的线程池介绍
(1)FixedThreadPool
这个线程池可以创建固定线程数的线程池。它的构造源码如下:
-
public static ExecutorService newFixedThreadPool(int nThreads) {
-
return new ThreadPoolExecutor(nThreads, nThreads,
-
0L, TimeUnit.MILLISECONDS,
-
new LinkedBlockingQueue<Runnable>());
-
}
- FixedThreadPool的corePoolSize和maxiumPoolSize都被设置为创建FixedThreadPool时指定的参数nThreads。
- 0L则表示当线程池中的线程数量操作核心线程的数量时,多余的线程将被立即停止
- 最后一个参数表示FixedThreadPool使用了无界队列LinkedBlockingQueue作为线程池的做工队列,由于是无界的,当线程池的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池的线程数量不会超过corePoolSize,同时maxiumPoolSize也就变成了一个无效的参数,并且运行中的线程池并不会拒绝任务。
(2)SingleThreadExecutor
-
public static ExecutorService newSingleThreadExecutor() {
-
return new FinalizableDelegatedExecutorService
-
( new ThreadPoolExecutor( 1, 1,
-
0L, TimeUnit.MILLISECONDS,
-
new LinkedBlockingQueue<Runnable>()));
-
}
(3)CachedThreadPool
-
public static ExecutorService newCachedThreadPool() {
-
return new ThreadPoolExecutor( 0, Integer.MAX_VALUE,
-
60L, TimeUnit.SECONDS,
-
new SynchronousQueue<Runnable>());
-
}
3.拒绝策略(饱和策略)
AbortPolicy
为java线程池默认的阻塞策略,不执行此任务,而且直接抛出一个运行时异常,切记ThreadPoolExecutor.execute需要try catch,否则程序会直接退出。
DiscardPolicy
丢弃当前任务
DiscardOldestPolicy
CallerRunsPolicy
用调用者线程执行
4.提交任务
(1)Callable:
该类任务有返回结果,可以抛出异常;
通过submit方法提交,返回Future对象;
可通过get获取执行结果。
(2)Runnable:
该类任务只执行,无法获取返回结果,无法抛出异常;
通过execute方法提交。
5.ThreadPoolExecutor运行机制(运行原理)
1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭