• 线程池介绍


    Executor

    Callable Runnable + ret

    异步

    future

    futuretask Future + Runnable

    CompletableFuture(任务管理类)

    提供链式处理方式

    allOf

    一堆任务的管理

    anyOf

    submit

    task

    ThreadPoolExecutor

    ForkJoinPool

    线程池维护两个集合

    线程

    任务

    各种参数

    Executors线程池的工厂

    SingleThreadExecutor

    线程池

     线程池分类#

    CachedThreadPool

    • 创建一个可缓存线程池,如果线程池长度超过处理需要
    • 可灵活回收空闲线程,(回收默认时间为1min)
    • 若无可回收,则新建线程
    • 线程池为无限大(Integer.MAX_VALUE)
    • 当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程

    FixedThreadPool

    • 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
    • 定长线程池的大小最好根据系统资源进行设置

    SingleThreadScheduledExecutor

    • 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

    ScheduledThreadPool#

    • 给定延时之后的运行任务或定期处理任务

    ForkJoinPool,jdk1.7以后的新线程池,分治算法,计算向数据移动

    将大任务切分成小任务执行,然后汇总

    用很少的线程执行很多的任务,TPE做不到先执行子任务

    CPU密集型

    ForkJoinTask

    ForkJoinTask的子类RecursiveAction

    RecursiveTask

    parallelStream也是用的ForkJoinPool

    fork,一个进程拆分成两个进程

    大任务拆分成小任务,然后汇总#

    WorkStealingPool#

    每一个线程都有自己单独的队列

    执行完自己任务会从其他线程上面偷取任务执行

    拒绝策略#

     生命周期

    •  RUNNING:能接受新提交的任务,并且也能处理阻塞队列中的任务
    •  SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务
    •  STOP:不能接受新任务,也不能处理队列中的任务,会中断正在处理任务的线程
    •  TIDYING:如果所有任务都终止了,workerCount(有效线程数)为0,线程池进入该状态后调用terminated()方法进入Terminated状态
    •  TERMINATED:在terminated方法执行完成后进入该状态,默认terminated方法中什么也没有做

    ThreadPoolExecutor 参数#

    public TreadPoolExecutor(
        int corePoolSize,       // 核心线程池数量
        int maximumPoolSize,    // 最大线程池数量
        long keepAliveTime,     // 临时线程的生命周期
        TimeUnit unit,          // 临时线程的生命周期单位
        BlockQueue<Runnable> workQueue, // 阻塞队列
        ThreadFactory threadFactory,    // 线程工厂
        RejectedExecutionHandler handler){ // 饱和策略(拒绝策略)
    }
    • ArrayBlockingQueue,基于数组,定长数组,缓存队列的数据对象,
    • LinkedBlockingQueue,基于链表,同ArrayListBlockingQueue类似
    • DelayQueue,只有当指定的延迟时间到了,才能够从队列中获取该元素
    • PriorityBlockingQueue,基于优先级的阻塞队列,不会阻塞数据生产者
    • SynchronousQueue,一种无缓冲的等待队列,类似于无中介的直接交易

    arrayblockingqueue和linkedblockqueue的区别

    • 队列中的锁不同
    • 队列大小初始化方式不同

    拒绝策略#

    • ThreadPollExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
    • ThreadPollExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常
    • ThreadPoolExecutor.DiscardOldestPolicy:丢弃对立最前面的任务,然后重新尝试执行任务
    • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

    Execute方法执行逻辑

    #

    • 如果当前运行的线程少于corePoolSize,则会创建新得线程来执行新的任务
    • 如果运行的线程个数等于或者大于corePoolSize,则会将提交的任务存放到阻塞队列workQueue中
    • 如果当前workQueue队列已满的话,则会创建新的线程来执行任务
    • 如果线程个数已经超过了maximumPoolSize,使用饱和策略RejectedExecutionHandler来进行处理

    Excutor和Submit#

    submit是基于方法Executor.execute(Runnable)的延申,通过创建并返回一个Future类对象,取消执行或等待完成

    线程池的关闭#

    关闭线程,可以通过shutDown和shutDownNow两个方法

    遍历线程池中所有的线程,然后依次中断

    shutdownNow首先将线程池的状态设置为STOP,然后尝试停止所有的正在执行和未执行任务的线程,并返回等待执行任务的列表

    shutdown只是将线程池的状态设置未SHUTDOWN状态,然后中断所有没有正在执行任务的线程

    Worker类

    单独的线程类,执行自己的任务

    execute

    1 core queue noncore 核心线程

    addWorker

    count++

    addworker start

    论读书
    睁开眼,书在面前
    闭上眼,书在心里
  • 相关阅读:
    bzoj 4260REBXOR
    bzoj 1009GT考试
    cf 621E. Wet Shark and Blocks
    cf 507E. Breaking Good
    cf 766#
    bzoj 3732Network
    bzoj 4300绝世好题
    bzoj 4345[POI2016]Korale
    bzoj 4236JOIOJI
    bzoj 4237稻草人
  • 原文地址:https://www.cnblogs.com/YC-L/p/14439151.html
Copyright © 2020-2023  润新知