线程池结构

63 阅读2分钟
  • jdk基本线程池相关接口和类
    • 接口:Executor、ExecutorService、ScheduledExecutorService
    • 抽象类:AbstractExecutorService
    • 实现类:ForkJoinPool、ThreadPoolExecutor、ScheduledThreadPoolExecutor
    • 工具类:Executors
  • spring线程池相关接口和类
    • 接口:TaskExecutor、AsyncTaskExecutor、AsyncListenableTaskExecutor、SchedulingTaskExecutor
    • 实现类:ThreadPoolTaskExecutor
    • 配置类:TaskExecutionProperties、
    corePoolSize:线程池维护线程最小的数量,默认为1
    maxPoolSize:线程池维护线程最大数量,默认为Integer.MAX_VALUE
    keepAliveSeconds:(maxPoolSize-corePoolSize)部分线程空闲最大存活时间,默认存活时间是60s
    queueCapacity:阻塞任务队列的大小,默认为Integer.MAX_VALUE,默认使用LinkedBlockingQueue
    allowCoreThreadTimeOut:设置为true的话,keepAliveSeconds参数设置的有效时间对corePoolSize线程也有效,默认是flase
    threadFactory::用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。使用开源框架guava提供的ThreadFactoryBuilder可以快速给线程池里的线程设置有意义的名字
    rejectedExecutionHandler:拒绝策略,当队列workQueue和线程池maxPoolSize都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常,有以下四种策略,当然也可以根据实际业务需求类实现RejectedExecutionHandler接口实现自己的处理策略
      ①AbortPolicy:丢弃任务,并且抛出RejectedExecutionException异常
      ②DiscardPolicy:丢弃任务,不处理,不抛出异常
      ③CallerRunsPolicy:只用调用者所在线程来运行任务
      ③DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务,并且重复该操作
    核心线程池保持常在,当核心线程池达到上限,将后续任务排到阻塞队列中,当阻塞队列排满后,扩容线程数量,当线程数量达到最大线程数后,启用拒绝策略。