优点


  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. 【kubeadm初始化报错】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    复现场景 环境 系统:Centos7 kubernetes:1.18.5 docker:19.03.9 复现步骤 1.通过 yum 或 rpm 安装 kubelet kubectl kubeadm,并 ...

  2. Linux--容器命令

    ***执行:yum install lrzsz 然后sz和rz命令就可以使用了 1.查找文件的命令:find / -name [文件名:override.xml] eg:  find / -name ...

  3. QtableWidget用法流程

    QtableWidget用法流程 ​ 作者:流火 日期:2020/5/10 QTableWidget的基本构造函数 QTableWidget 是QTableview的子类.主要去呗是QTableVie ...

  4. python之浅谈计算机基础

    目录 一.计算机基础之编程 什么是编程语言 什么是编程 为什么要编程 二.计算机组成原理 1. 计算机五大组成 CPU 存储器 输入设备 输出设备 2.计算机五大部分补充 CPU相关 应用程序启动流程 ...

  5. hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)

    hive 查询语法 select [all | distinct] select_ condition, select_ condition from table_name a [join table ...

  6. WSL配置高翔vslam环境配置流水账

    1 安装参考博文链接:https://www.cnblogs.com/dalaska/p/12802384.html 2 Ubuntu 16.04地址:https://www.microsoft.co ...

  7. CountDownLatch 线程工具类

    CountDownLatch:概念是,允许一个或多个线程等待其他线程完成操作: 在线程基础知识中,学习过线程的join方法,当前线程阻塞等待join线程执行完毕才能执行: 测试代码如下: public ...

  8. 栈的压入、弹出序列(剑指offer-21)

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  9. Pop!_OS配置JAVA环境

    Pop!_OS配置JAVA环境 #0x0 安装vscode #0x1 安装JDK #0x2 配置vscode #0x3 安装Eclipse #0x0 安装vscode 见Pop!_OS下安装C++编程 ...

  10. CTFHub_技能树_SQL注入Ⅱ

    SQL注入 MySQL结构 进行尝试: 尝试查看表名: 尝试查看列名: 发现无法直接输出: 使用时间注入脚本跑出结果: import requests import time session = re ...