线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。这里需要注意的是:在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动,除非调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程。再考虑到keepAliveTime和allowCoreThreadTimeOut超时参数的影响,所以没有任务需要执行的时候,线程池的大小不一定是corePoolSize。
1、corePoolSize 线程池核心线程大小
线程池中允许的最大线程,队列满了则会创建不超过这个大小的线程数
2、maximumPoolSize 线程池最大线程数量
3、keepAliveTime 空闲线程存活时间
4、unit 线程存活时间单位
5、workQueue 工作队列
(1)ArrayBlockingQueue
(2)LinkedBlockingQueue
(3)SynchronousQueue
新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程(大小为1的队列)
(4)PriorityBlockingQueue
具有优先级的无界阻塞队列,
6.threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
7.handler 拒绝策略
①CallerRunsPolicy
该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。
②AbortPolicy
该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。
③DiscardPolicy
该策略下,直接丢弃任务,什么都不做。
④DiscardOldestPolicy
该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列