线程池的七个关键参数
-
corePoolSize 该线程池中核心线程数最大值
核心线程:在创建完线程池之后,核心线程先不创建,在接到任务之后创建核心线程。并且会一直存在于线程池中(即使线程啥都不干),有任务要执行时,如果核心线程没有被占用,会优先用核心线程执行任务。数量一般情况下设置为CPU核树的二倍即可。
-
maximumPoolSize 该线程池中线程总数最大值
线程总数=核心线程数+非核心线程数 非核心线程数: 简单理解,即核心线程都被占用,但还有任务要做,就创建非核心线程。
-
keepAliveTime 非核心线程闲置超时时长
这个参数可以理解为,任务少 但池中线程多,非核心线程不能白养着,超过这个时间不工作的就会被干掉,但是核心线程会保留。
-
TimeUnit:keepAliveTime单位
-
BlockingQueue workQueue: 线程池中的任务队列 默认情况下,任务进来之后会先分配给核心线程执行,核心线程如果被占用,并不会立刻开启非核心线程执行任务,而是将任务插入任务队列等待执行,核心线程会从任务队列取任务来执行,任务队列可以设置最大值,一旦插入的任务足够多,达到最大值,才会创建非核心线程来执行任务。
-
ThreadFactory threadFactory -> 创建线程的工厂 可以用线程工厂给每个创建出来的线程设置名字,一般情况下无需设置该参数。
-
RejectedExecutionHandler handler -》饱和拒绝策略 这是当任务队列和线程池都满了时所采取的策略,默认是AbortPolicy AbordPolicy: 表示无法处理新任务,抛出拒绝异常。 CallerRunsPolicy: 用调用者所在的线程来处理任务。 DiscardPolicy: 不行执行的任务,并将该任务删除。 DiscardOldestPolicy: 丢弃队列最近的任务,并执行当前的任务。