跳转至

线程池

#concurrent/pool


  • 线程池:管理线程
    • coreSize:通常设置为CPU Core+1,如果是IO密集型则可以设置更大(如CPU Core x2+1)
  • 任务队列:缓存任务
    • 当线程数小于coreSize,则创建新线程执行新任务
    • 当线程数等于coreSize、核心线程繁忙、任务队列未满,则放入任务队列,等待核心线程空闲
    • 当线程数大于等于coreSize且小于maxSize、核心线程繁忙、任务队列满,则创建新线程执行,当线程空闲时间超过keepAlive、线程数大于coreSize则销毁
    • 当线程数等于maxSize,任务队列满,则执行拒绝策略
  • 任务队列类型
    • 首先,必须是一个BlockingQueue
    • ArrayBlockingQueue:有界
    • LinkedBlockingQueue:有/无界,Executors默认无
    • PriorityBlockingQueue:优先级无界,使用Comparator排序
    • SynchronousQueue:无容量,即无缓存,线程池会直接创建线程执行任务,线程数满则执行拒绝策略
    • DelayQueue:无界,Delayed容器,按延时排序,自定义顺序
  • allowCoreThreadTimeOut:默认false,允许核心线程在空闲超时时关闭

参考

SpringScheduling

  • springboot-2.5.15
    • coreSize:1
    • maxSize:Integer.MAX_VALUE
    • keepAlive:0
    • 拒绝策略:AbortPolicy
      • 可通过TaskSchedulerCustomizer配置
      • 可以配置ErrorHandler处理异常,如RejectedExecutionException
    • queueCapacity:Integer.MAX_VALUE
    • 队列:JUC默认的DelayedWorkQueue,不可配置,除非重写ThreadPoolTaskScheduler
      public ScheduledThreadPoolExecutor(int corePoolSize,  
                                         ThreadFactory threadFactory,  
                                         RejectedExecutionHandler handler) {  
          super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,  
                new DelayedWorkQueue(), threadFactory, handler);  
      }
      

SpringAsync

  • springboot-2.5.15
    • coreSize:8
    • maxSize:Integer.MAX_VALUE
    • keepAlive:60s
    • 拒绝策略:AbortPolicy
      • 可通过TaskExecutorCustomizer配置
    • queueCapacity:Integer.MAX_VALUE
    • 队列:默认无界队列
      • 有配置队列容量则用LinkedBlockingQueue
      • 无则SynchronousQueue