JAVA 线程池(三)ThreadPoolExecutor 参数

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任务队列、等待有空闲的核心线程、执行该任务 

任务线程个数 > 核心线程数    任务线程个数 > 最大线程数 (在设置队列大小的情况下)

队列排队、 超出任务队列的大小、则创建新的非核心线程执行任务、超过最大线程数时抛出异常

你可能感兴趣的:(JAVA 线程池(三)ThreadPoolExecutor 参数)