七个参数的构造方法如下

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
  1. 核心池线程的数量 corePoolSize
  2. 最大池数量 maximumPoolSize
  3. 存活时间 keepAliveTime
  4. 时间单位 unit (java8新特性:在3.全新的日期时间 API有介绍)
  5. 线程阻塞队列 workQueue
  6. 创建线程的工程 threadFactory
  7. 超过阻塞队列时新来的线程请求拒绝策略 handler

之间的区别通过对比来理解 corePoolSize 和 maximumPoolSize

我们先看下通过Executors创建的线程池
只观看前面两个参数

// 创建单线程的线程池
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
// 创建固定个数的线程池
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
// 创建可变个数的线程池
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}

通过比较很容易理解这两个参数的意思,第一个参数corePoolSize就是池中会一直存在的个数。
第二个参数maximumPoolSize就是这个池最多有多少个线程
反过来自己解读Executors中提供的3个方法很容易理解3个方法方法名的含义

第三、第四个参数很容易理解就是线程池中除了 corePoolSize 个线程会一直存活以外,其它非核心的线程如果超过了规定的时间则会销毁该线程。

第五个参数则是使用那种阻塞队列,例如:newCachedThreadPool(),从其名称可知该方式创建的线程池线程数几乎没有最大值(最大值是:Integer.MAX_VALUE,基本上到这个值前,早就OOM了,内存早不够用了),因此使用阻塞队列SynchronousQueue(特点队列长度为0的),每来一个请求就创建一个线程去处理(这种方式很不好,很容易OOM)。

有8种阻塞队列实现了BlockingQueue接口(前面四种最常用)例如:

  1. ArrayBlockingQueue由数组构成的有界阻塞队列
  2. LinkedBlockingDeque由链表构成的有界阻塞队列(默认队列长度大小Integer.MAX_VALUE)
  3. SynchronousQueue不存储元素的阻塞队列,单个元素的队列
  4. DelayQueue使用优先级队列实现的无界阻塞队列
  5. DelayedWorkQueue是ScheduledThreadPoolExecutor的静态内部类中,不对外使用,作为了解
  6. LinkedTransferQueue由链表构成的无界阻塞队列
  7. LinkedBlockingDeque由链表构成的双向阻塞队列(注意末尾单词是Deque不是Queue)
  8. PriorityBlockingQueue支持优先级排序的无界阻塞队列

如下图是阻塞队列接口和实现类的关系

第六个参数则是创建线程的工厂,一般来说使用Executors.defaultThreadFactory()就可以了

第七个参数,线程队列如果存不下新来的请求时的拒绝策略 handler

常用的拒绝策略有下面四种(都是ThreadPoolExecutor的内部类)

  1. AbortPolicy策略,直接拒绝并抛异常
  2. DiscardPolicy策略,直接拒绝不抛异常
  3. DiscardOldestPolicy策略,丢弃头节点,意思是丢弃等待时间最长的节点,然后加入当前请求到队列
  4. CallerRunsPolicy策略。让调用的线程来处理任务,不使用线程池的线程来处理

创建线程池填入的第七个参数的使用方式,可以直接通过new得到,例如new ThreadPoolExecutor.AbortPolicy()

面试考点:

非核心线程会在阻塞队列满时才会创建,当核心线程被用完,新任务会加入阻塞队列中,如果一直加导致阻塞队列用完,才会创建非核心线程。

以下面一段测试代码为例:
你可以自己调试一下下面的程序

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ThreadLocalDemo {public static void main(String[] args) {ArrayBlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<>(10);ThreadPoolExecutor threadPoolExecutor;threadPoolExecutor = new ThreadPoolExecutor(10, 25, 10, TimeUnit.MINUTES, blockingQueue, Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());for (int i = 0; i < 100; i++) {threadPoolExecutor.execute(()->{System.out.println(Thread.currentThread().getName());try {TimeUnit.MINUTES.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}});if (i==20){Object[] objects = blockingQueue.toArray();System.out.println("hello");}}System.out.println("hello world");}
}


当 i 的值为21时我们看下线程池中的线程数,以及阻塞队列的队列数

线程池ThreadPoolExecutor的七大参数相关推荐

  1. 线程池中的七大参数(三)

    线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...

  2. 线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?

    为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool = Executors.newFixedThreadPool( ...

  3. java 线程池ThreadPoolExecutor

    线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...

  4. Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...

  5. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...

  6. Java线程池ThreadPoolExecutor的实例

    Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...

  7. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

  8. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

  9. 线程池ThreadPoolExecutor的使用方法

    private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS, new Li ...

最新文章

  1. 复制内存时检测到可能的io争用条件_这篇高并发服务模型大科普,内部分享时被老大表扬了...
  2. Font support in Adobe form
  3. arduino与matlab联调出现问题
  4. Android官方开发文档Training系列课程中文版:数据存储之键值对序列存储
  5. mysql添加联合主键
  6. css如何调整红心样式_在JavaScript应用程序中包含CSS的多种方法「渡一」
  7. Kinect v1和Kinect v2的彻底比较
  8. pmp知识点详解-项目大牛整理_PMP项目管理第六章:项目进度管理(5)核心知识点...
  9. 项目展示-新浪微博客户端
  10. 一种极端思维引起的幻觉
  11. 做.NET开发解决Extjs4智能感知
  12. Delphi初浅入门笔记之六:高级数据类型
  13. 计算机一级c类题库及答案解析,全国计算机一级考试试题题库及答案
  14. 知识库文章MDL9396274-How to:使用色环电阻计算器
  15. 今日头条java后端四面_今日头条笔试第二批后端开发第一题java实现
  16. bin code led_LED混Bin生控制文件.pdf
  17. Loser,除了努力你还会什么?
  18. 如何修改vant组件中filed的placeholder的 颜色
  19. 【HDLBits 刷题】所有答案直达链接汇总
  20. 平凡之路上,请不要后会无期

热门文章

  1. 福禄克FLUKE 435-2与438-2三相电能质量分析仪特性
  2. 迭代函数系统matlab实现,线性随机IFS迭代Matlab示例程序.doc
  3. 选股服务器列表为空 无法执行选股,东方财富客户端如何设置自动选择服务器 设置有条件选股方法...
  4. i513400和13400f区别 i5 13400和i5 13400f选哪个好
  5. 我的第一个Ai软件发布 - Super LRC Editor WIth AI
  6. 到哪下c语言编译器,在那里可以下载到C语言的编译器
  7. 用Python制作有声小说
  8. springmvc 下载文件ie8可用
  9. 新硬盘稳定性测试软件,Active@ Hard Disk Monitor 3.1硬盘检测及监控工具免费版
  10. java jsp 汽车销售管理系统