当前位置:首页 > 技术 > 后端 > 正文内容

Java线程池ThreadPoolExecutor面试总结思维导图速记

anan3个月前 (07-27)后端111

优点

  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)

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

喜欢可以点个赞,感谢!

打赏
版权声明:所有来源为第三方内容,若本站收录的文章无意侵犯了贵司版权,请给下面邮箱地址来信,我们会及时处理和回复,谢谢。

管理员邮箱:42004990@qq.com

微信公众号

分享给朋友:

相关文章

OAuth2.0分布式系统环境搭建

OAuth2.0分布式系统环境搭建

好好学习,天天向上本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航介绍OAuth(开放授权)是一个开放...

OAuth 2.0详解

OAuth 2.0详解

OAuth 2.0详解概念:OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如基本消息,照片,联系人列表),而无需将 用户名 和 密码 提供给第三方应...

MapReduce之WritableComparable排序

MapReduce之WritableComparable排序

@目录排序概述获取Mapper输出的key的比较器(源码)案例实操(区内排序)自定义排序器,使用降序Key实现Comparable进行比较排序概述排序是MapReduce框架中最重要的操作之一。Map...

Java 分布式任务调度平台:PowerJob 快速开始+配置详解

Java 分布式任务调度平台:PowerJob 快速开始+配置详解

本文适合有 Java 基础知识的人群作者:HelloGitHub-Salieri引言HelloGitHub 推出的《讲解开源项目》系列。项目地址:https://github.com/KFCFans/...

Java反射详解

Java反射详解

一、反射概述1. java.lang.Class:是反射的源头我们创建一个类,通过编译,生成对应的.calss文件,之后使用java.exe加载(jvm的类加载器)此.class文件,此.class文...

深入理解Java虚拟机--个人总结(持续更新)

深入理解Java虚拟机--个人总结(持续更新)

深入理解Java虚拟机--个人总结(持续更新)每天按照书本学一点,会把自己的总结思考写下来,形成输出,持续更新,立帖为证-- 2020年7月7日 开始第一次学习 -- ...