线程池

作者: 填坑之路_DK | 来源:发表于2021-04-20 00:20 被阅读0次

线程池种类

ThreadPoolExecutor

基础线程池

线程执行任务过程

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

线程池配置

名称 类型 说明
corePoolSize int 核心线程数 (最小线程数)
maximumPoolSize int 最大线程数
keepAliveTime long 非核心线程空闲时间(超出会删除)
unit TimeUnit 非核心线程空闲时间单位
workQueue BlockingQueue<Runnable> 等待队列
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
  • 没有异常处理器
  • 先进先出队列

相关文章

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • ThreadPoolExecutor线程池原理以及源码分析

    线程池流程: 线程池核心类:ThreadPoolExecutor:普通的线程池ScheduledThreadPoo...

  • 线程池

    线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势第一:降低资源消耗。通过重复利用已创建...

  • java 线程池使用和详解

    线程池的使用 构造方法 corePoolSize:线程池维护线程的最少数量 maximumPoolSize:线程池...

  • 线程池

    JDK线程池 为什么要用线程池 线程池为什么这么设计 线程池原理 核心线程是否能被回收 如何回收空闲线程 Tomc...

网友评论

      本文标题:线程池

      本文链接:https://www.haomeiwen.com/subject/tcdwlltx.html