线程池

作者: 填坑之路_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
    • 没有异常处理器
    • 先进先出队列

    相关文章

      网友评论

          本文标题:线程池

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