一、线程池的核心参数、
线程池默认参数:
corePoolSize(核心线程数)
1、 核心线程会一直存在,即使没有任务执行。
2、当线程数小于核心线程数的时候,即使有空闲线程,也会一直创建线程直到达到核心线程数。
3、设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
queueCapacity(任务队列容量)
也叫阻塞队列,当核心线程都在运行,此时再有任务进来,会进入任务队列,排队等待线程执行。
maxPoolSize(最大线程数)
1、线程池里允许存在的最大容量。
2、当任务队列已满线程数量大于等于核心线程数时,会创建新的线程执行任务。
keepAliveTime
1、当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数等于核心线程数。
2、如果设置了allowCoreThreadTimeout=true,则线程会退出直到线程数等于零。
allowCoreThreadTimeout(允许核心线程超时)
rejectedExecutionHandler(任务拒绝处理器)
1、当线程数量达到最大线程数,且任务队列已满时,会拒绝任务;
2、调用线程池shutdown()方法后,会等待执行完线程池的任务之后,再shutdown()。如果在调用了shutdown()方法和线程池真正shutdown()之间提交任务,会拒绝新任务。
二、线程池的拒绝策略
在使用线程池时,当线程数等于最大线程数而且任务队列已满时,这时候拒绝策略就会执行。
在jdk有自带的四种拒绝策略:
1、ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。
2、ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。
3、ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。
4、ThreadPoolExecutor.DiscardPolicy,丢弃任务,不抛出异常(相当于无声无息的丢掉了)。
因为只自带的四种拒绝策略一般不能满足我们的实际需求,所以都会自定义拒绝策略来执行。
三、线程池的执行
1、当线程数小于核心线程数时,会一直创建线程直到到达核心线程数。
2、当线程数等于核心线程数时,新加入的任务会放入任务队列等待执行。
3、当任务队列已满又有新的任务时,会创建线程直到到达最大线程数。
4、当线程数等于最大线程数且任务队列也满时,新加入任务会被拒绝。