优点


  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)

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

喜欢可以点个赞,感谢!

Java线程池ThreadPoolExecutor面试总结思维导图速记的更多相关文章

  1. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  2. Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  3. Java线程池ThreadPoolExecutor使用和分析(一)

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  4. Java线程池ThreadPoolExecutor类源码分析

    前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...

  5. [原创]Java性能优化权威指南读书思维导图

    [原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 ...

  6. [原创]Java性能优化权威指南读书思维导图4

    [原创]Java性能优化权威指南读书思维导图4

  7. [原创]Java性能优化权威指南读书思维导图3

    [原创]Java性能优化权威指南读书思维导图3

  8. [原创]Java性能优化权威指南读书思维导图2

    [原创]Java性能优化权威指南读书思维导图2

  9. java线程池ThreadPoolExecutor使用简介

    一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...

随机推荐

  1. PAT A1003 Emergency 题解

    PAT A1003 Emergency PAT A1003 Emergency 题目简述: 原题为英文题目,所以在这里简述一下题意: 给定n个点和m条无向路以及起点.终点 下面一行n个数,第i个数表示 ...

  2. 解决wpf项目中无法添加OpenFileDialog 实例的问题

    直接添加引用:using Microsoft.Win32; 或者放置鼠标于OpenFileDialog OpenFileDialog ofd = new OpenFileDialog(); 操作点击

  3. Python3笔记010 - 3.1 程序结构

    第3章 流程控制语句 3.1 程序结构 程序设计的基本结构: 顺序结构---顺序执行所有语句 选择结构---选择执行部分语句 循环结构---循环执行部分语句 1.顺序结构 按照顺序执行语句. 2.选择 ...

  4. 如何配置webpack让浏览器自动补全前缀

    一.postcss-loader有什么用? PostCSS 本身是一个功能比较单一的工具.它提供了一种方式用 JavaScript 代码来处理 CSS.它负责把 CSS 代码解析成抽象语法树结构(Ab ...

  5. P1330 封锁阳光大学——深度优先搜索DFS

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由 \(n ...

  6. python中获取文件路径的几种方式

    # 如果执行文件为E:\aa\bb\aa.py 1.获取当前路径 current_path11 = os.path.abspath(__file__) current_path12 = os.path ...

  7. 002.Nginx安装及启动

    一 Nginx yum安装 1.1 前置准备 1 [root@nginx01 ~]# systemctl status firewalld.service #检查防火墙 2 [root@nginx01 ...

  8. 准备开始了解orchardcore,有兴趣的一起啊

    orchardcore网上的资料真是少,开始看源码,目前遇到的最大问题是不知道ModuleName属性如何自动注入到OrchardCore.Cms.Web的程序集Assembly上面,等这个搞通了估计 ...

  9. SpringMVC如何从默认的index.jsp页面跳转到其他页面

    最近学习SpringMVC时,想要做一个登录页面Login.jsp,发现Tomcat服务器默认进入的页面是WEB-INF/index.jsp,查询资料发现如果修改默认页面,还需要修改Tomcat文件目 ...

  10. CTFHub_技能树_信息泄露

    常用备份文件名: www.zip bak文件 在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容 以 ind ...