线程池—线程池中的参数与线程池的处理流程

线程池中的重要参数:

  1. corePoolSize:核心线程数,通俗的说就是队列没满时,最大线程并发数
  2. workQueue: 阻塞队列类型
  3. maximumPoolSizes:最大线程数,通俗的说就是当阻塞队列满了的时候,最大的并发数
  4. RejectedExecutionHandler:拒绝策略,当任务数超过maximumPoolSizes + workQueue 时,任务会触发拒绝策略。JDk有四种默认的拒绝策略,见最下面
  5. keepAliveTime:空闲时间多久会被回收的时间限制

线程池的处理流程

当一个任务来了的时候

  • 会先判断是否超过corePoolSize,如果没有超过,就新建一个线程执行任务并加入线程池线;若超过了corePoolSize则会尝试放入阻塞对列
  • 如果阻塞对列没有满,就在阻塞队列中等待执行,如果阻塞队列满了,就尝试新建一个线程处理
  • 如果线程池中的线程数没有超过了maximumPoolSizes最大线程数,则新建一个线程处理任务并加入到线程池中;如果超过maximumPoolSizes则会调用RejectedExecutionHandler拒绝策略处理
  • 空闲的线程(非核心线程)会在到达keepAliveTime时间之后没有被使用的话就被回收

线程池—线程池中的参数与线程池的处理流程

拒绝策略

  1. CallerRunsPolicy:只要线程池不关闭,就执行任务
  2. AbortPolicy:丢弃任务,抛出运行时异常
  3. DiscardPolicy:直接忽视,什么也不发生
  4. DiscardOldestPolicy:将任务队列中最先进入的任务移除,并将新任务加入对列。