ThreadPoolExecutor的参数:
其实理解每个参数的意思、各种类型线程池你都会创建了
构造方法:4个构造方法
构造方法参数说明
corePoolSize:核心线程数
核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。
maximumPoolSize:最大线程数
线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingDeque时,这个值无效。
keepAliveTime:非核心线程闲置超时时间
非核心线程的闲置超时时间,超过这个时间就会被回收。
unit:keepAliveTime的单位
指定keepAliveTime的单位,如TimeUnit.SECONDS。当将allowCoreThreadTimeOut设置为true时对corePoolSize生效。
queue:任务队列
线程池中的任务队列.
常用的有三种队列
SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。
threadFactory:线程工厂
线程工厂,提供创建新线程的功能。ThreadFactory是一个接口,只有一个方法
public interface ThreadFactory{ Thread newThread(Runnable r); }
通过线程工厂可以对线程的一些属性进行定制。
提供默认的工厂:DefaultThreadFactory
RejectedExecutionHandler
RejectedExecutionHandler也是一个接口,只有一个方法
public interface RejectedExecutionHandler{
void rejectedExecution(Runnable var1, ThreadPoolExecutor var2);
}
当线程池中的资源已经全部使用,添加新线程被拒绝时,会调用RejectedExecutionHandler的rejectedExecution方法。
任务队列的使用
(两种SynchronousQueue-LinkedBlockingDeque)
使用:SynchronousQueue (队列大小设不设置都一样--个人理解)
(因为不会在队列里排队、收到任务直接开启新的非核心线程)
当任务线程个数 < 核心线程数默认使用存活的核心线程
当 任务线程个数 > 核心线程数 任务线程个数 <= 最大线程数
会创建非核心线程、在任务完成后、闲置时间达到了超时时间就会被清除
当任务线程个数> 核心线程数 任务线程个数 > 最大线程数
会因为线程池拒绝添加任务而抛出异常
使用:LinkedBlockingDeque
当任务线程个数 < 核心线程数默认使用存活的核心线程
当 任务线程个数 > 核心线程数 (在不设置队列大小的情况下)
将任务放入LinkedBlockingDeque任务队列、等待有空闲的核心线程、执行该任务
当任务线程个数 > 核心线程数 任务线程个数 > 最大线程数 (在设置队列大小的情况下)
队列排队、 超出任务队列的大小、则创建新的非核心线程执行任务、超过最大线程数时抛出异常