zoukankan      html  css  js  c++  java
  • Java线程池ThreadPoolExecutor面试总结思维导图速记

    优点


    1. 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    2. 提高响应速度,当任务到达时,可以不需要等待线程创建就能立即执行。
    3. 提高线程的可管理性

    类关系


    接 Executor 一个无返回值的execute方法
    接 ExecutorService 返回值为Future类型的submit方法
    类 AbstractExecutorService
    类 ThreadPoolExecutor

    创建


    ThreadPoolExecutor类

    包含参数

    corePoolSize: 核心线程数最大值
    maximumPoolSize: 最大线程数大小
    keepAliveTime: 非核心线程空闲的存活时间大小
    unit: 线程空闲存活时间单位
    workQueue: 存放任务的阻塞队列
    threadFactory: 用于设置创建线程的工厂
    handler:  线城池的饱和策略事件
    

    参数workQueue有如下几种队列

    1. ArrayBlockingQueue; 必须带参构造,数组,默认非公平可指定,FIFO
    2. LinkedBlockingQueue; 可带参构造,大小默认int最大,FIFO
    3. SynchronousQueue;不存储元素,每个插入操作必须等到另一个线程调用移除操作,否则堵塞
    4. PriorityBlockingQueue;优先级,数组
    5. DelayQueue; 基于PriorityQueue,延时阻塞队列,只有当其指定的延迟时间到了,才能够从队列中获取到该元素。

    参数hander有如下几种

    1. AbortPolicy 丢弃任务并抛异常,默认
    2. DiscardPolicy 直接丢弃任务
    3. DiscardOldestPolicy 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
    4. CallerRunsPolicy 由调用线程处理该任务

    Executors类

    阿里巴巴开发规范不允许使用Executors去创建,因为队列OOM。
    主要有如下几种

    1. newCachedThreadPool():一个任务创建一个线程,使用SynchronousQueue,用于并发执行大量短期的小任务。
    2. newFixedThreadPool(nThreads):所有任务使用固定大小的线程池,使用LinkedBlockingQueue,适用执行长期的任务
    3. newSingleThreadExecutor():只有一个线程的线程池,使用LinkedBlockingQueue,适用于串行执行任务的场景,

    执行流程


    在 execute() 中实现,当提交一个线程时

    1. 如果正在运行的线程数 < coreSize,马上创建线程执行该task,不排队等待;
    2. 如果正在运行的线程数 >= coreSize,把该task放入队列;
    3. 如果队列已满 && 正在运行的线程数 < maximumPoolSize,创建新的线程执行该task;
      4 . 如果队列已满 && 正在运行的线程数 >= maximumPoolSize,线程池调用handler的reject方法拒绝本次提交。

    异常捕获


    默认不捕获异常,捕获方法如下

    1. try-catch
    2. submit执行,Future.get接受异常
    3. 重写ThreadPoolExecutor的afterExecute方法,处理传递的异常引用
    4. 为工作者线程设置UncaughtExceptionHandler,在uncaughtException方法中处理异常

    线程池状态


    running
    该状态的线程池会接收新任务,并处理阻塞队列中的任务;

    1. shutdown() -> shutdown
    2. shutdownNow() -> stop

    shutdown
    该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;

    1. 队列为空,并且线程池中执行的任务也为空,进入tidying状态;

    stop
    该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;

    1. 线程池中执行的任务为空,进入tidying状态;

    tidying
    该状态表明所有的任务已经运行终止,记录的任务数量为0。

    1. terminated() -> terminated

    terminated
    该状态表示线程池彻底终止

    线程大小设置


    1. 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 N(cpu) + 1
    2. 如果是IO密集型任务,参考值可以设置为2 * N(cpu)

    思维导图(右键另存为下载)

    在这里插入图片描述

    喜欢可以点个赞,感谢!

  • 相关阅读:
    困扰我的c++语法
    C++ primer第三章作业
    渔夫捕鱼问题
    JAVA输入输出
    Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归
    牛顿迭代法计算平方根
    Python学习4——条件、循环及其他语句总结
    Python补充1——Python的简单推导
    Python补充2——Python单行注释、整段注释使用方法
    Python补充3——Python中的 split() 函数
  • 原文地址:https://www.cnblogs.com/neverth/p/13388627.html
Copyright © 2011-2022 走看看