线程池

线程池种类

ThreadPoolExecutor

基础线程池

线程执行任务过程

  • 当前执行线程数 < corePoolSize 直接获取corePoolSize空闲线程执行(没有则创建)
  • 当前执行线程数 > corePoolSize && workQueue.offer = true (队列未满) 进入队列
  • 当前执行线程数 > corePoolSize && 队列已满 && 当前执行线程数 < maximumPoolSize ,创建线程执行
  • 否则执行拒绝策略

线程池配置

名称 类型 说明
corePoolSize int 核心线程数 (最小线程数)
maximumPoolSize int 最大线程数
keepAliveTime long 非核心线程空闲时间(超出会删除)
unit TimeUnit 非核心线程空闲时间单位
workQueue BlockingQueue 等待队列
threadFactory ThreadFactory 创建线程的线程工厂 默认DefaultThreadFactory
handler RejectedExecutionHandler 线程拒绝策略

线程拒绝策略什么时候执行

  • 线程池被关闭
  • 任务队列已满且maximumPoolSizes已满

线程拒绝策略说明

  • AbortPolicy 默认策略, 抛出RejectedExecutionException运行时异常
  • CallerRunsPolicy 阻塞提交任务的线程
  • DiscardPolicy:直接丢弃新提交的任务
  • DiscardOldestPolicy:如果执行器没有关闭,队列头的任务将会被丢弃,然后执行器重新尝试执行任务(如果失败,则重复这一过程)

核心方法

submit()

提交任务

ScheduledThreadPoolExecutor 继承 ThreadPoolExecutor

定时器线程池(延时)

与ThreadPoolExecutor 相比,线程池配置有以下区别

  • 只能定义corePoolSize
  • maximumPoolSize为int最大值
  • 不允许有空闲线程(超过corePoolSize的线程在0纳秒后被删除)
  • work队列只能是DelayedWorkQueue

核心方法

submit()

提交立即执行的任务

schedule()

提交延时任务

ForkJoinPool

多线程计算线程池,让任务拆分至多个线程(分而治之),最后得到任务的最终结果

线程池配置

名称 类型 说明
workerNamePrefix ( 不可配置 ) String 工作线程池名前缀
factory ForkJoinWorkerThreadFactory 创建线程的工厂
parallelism int 同时执行的数量 [1,intMAX - 1 ]
handler UncaughtExceptionHandler 异常处理器
mode boolean 队列模式 ture FIFO_QUEUE 先进先出, false LIFO_QUEUE 后进先出

核心方法

execute()

启动任务,将任务放入工作队列

awaitJoin()

当前任务等待其task的执行

Executors创建线程池

newFixedThreadPool(线程数量,创建工厂) //ThreadPoolExecutor

创建固定大小的线程池

  • corePoolSize = maximumPoolSize
  • 0毫秒后删除空闲队列
  • 可指定ThreadFactory
  • 队列为 LinkedBlockingQueue
  • 默认拒绝策略

newCachedThreadPool() //ThreadPoolExecutor

创建 corePoolSize 为0 maximumPoolSize 为 intMax的线程池

  • corePoolSize = 0
  • maximumPoolSize = Integer.MAX_VALUE
  • 60s后删除默认线程
  • 只能是 DefaultThreadFactory
  • 队列为 SynchronousQueue
  • 默认拒绝策略

newSingleThreadExecutor() //ThreadPoolExecutor

创建单例线程池

  • corePoolSize = 1
  • maximumPoolSize = 1
  • 0毫秒后删除空闲队列
  • 只能是 DefaultThreadFactory
  • 队列为 LinkedBlockingQueue
  • 默认拒绝策略

newScheduledThreadPool(线程数量,创建工厂) //ScheduledThreadPoolExecutor

创建延时线程池

  • 默认拒绝策略
  • 可指定ThreadFactory

newSingleThreadScheduledExecutor() // ScheduledThreadPoolExecutor

创建单例延时线程池

  • corePoolSize = 1
  • 默认拒绝策略

newWorkStealingPool() // ForkJoinPool

创建ForkJoinPool线程池

  • 同时执行的数量 = cpu数量
  • 线程创建工厂为ForkJoinWorkerThreadFactory
  • 没有异常处理器
  • 先进先出队列

你可能感兴趣的:(线程池)