线程池ThreadPoolExecutor的七大参数
七个参数的构造方法如下
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
- 核心池线程的数量 corePoolSize
- 最大池数量 maximumPoolSize
- 存活时间 keepAliveTime
- 时间单位 unit (java8新特性:在3.全新的日期时间 API有介绍)
- 线程阻塞队列 workQueue
- 创建线程的工程 threadFactory
- 超过阻塞队列时新来的线程请求拒绝策略 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接口(前面四种最常用)例如:
ArrayBlockingQueue
由数组构成的有界阻塞队列LinkedBlockingDeque
由链表构成的有界阻塞队列(默认队列长度大小Integer.MAX_VALUE)SynchronousQueue
不存储元素的阻塞队列,单个元素的队列DelayQueue
使用优先级队列实现的无界阻塞队列DelayedWorkQueue
是ScheduledThreadPoolExecutor的静态内部类中,不对外使用,作为了解LinkedTransferQueue
由链表构成的无界阻塞队列LinkedBlockingDeque
由链表构成的双向阻塞队列(注意末尾单词是Deque不是Queue)PriorityBlockingQueue
支持优先级排序的无界阻塞队列
如下图是阻塞队列接口和实现类的关系
第六个参数则是创建线程的工厂,一般来说使用Executors.defaultThreadFactory()
就可以了
第七个参数,线程队列如果存不下新来的请求时的拒绝策略 handler
常用的拒绝策略有下面四种(都是ThreadPoolExecutor的内部类
)
- AbortPolicy策略,直接拒绝并抛异常
- DiscardPolicy策略,直接拒绝不抛异常
- DiscardOldestPolicy策略,丢弃头节点,意思是丢弃等待时间最长的节点,然后加入当前请求到队列
- 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)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...
- 线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?
为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool = Executors.newFixedThreadPool( ...
- java 线程池ThreadPoolExecutor
线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...
- Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...
- Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...
- Java线程池ThreadPoolExecutor的实例
Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...
- java线程池执行器_Java线程池ThreadPoolExecutor的使用
Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...
- c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...
- 线程池ThreadPoolExecutor的使用方法
private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS, new Li ...
最新文章
- 复制内存时检测到可能的io争用条件_这篇高并发服务模型大科普,内部分享时被老大表扬了...
- Font support in Adobe form
- arduino与matlab联调出现问题
- Android官方开发文档Training系列课程中文版:数据存储之键值对序列存储
- mysql添加联合主键
- css如何调整红心样式_在JavaScript应用程序中包含CSS的多种方法「渡一」
- Kinect v1和Kinect v2的彻底比较
- pmp知识点详解-项目大牛整理_PMP项目管理第六章:项目进度管理(5)核心知识点...
- 项目展示-新浪微博客户端
- 一种极端思维引起的幻觉
- 做.NET开发解决Extjs4智能感知
- Delphi初浅入门笔记之六:高级数据类型
- 计算机一级c类题库及答案解析,全国计算机一级考试试题题库及答案
- 知识库文章MDL9396274-How to:使用色环电阻计算器
- 今日头条java后端四面_今日头条笔试第二批后端开发第一题java实现
- bin code led_LED混Bin生控制文件.pdf
- Loser,除了努力你还会什么?
- 如何修改vant组件中filed的placeholder的 颜色
- 【HDLBits 刷题】所有答案直达链接汇总
- 平凡之路上,请不要后会无期
热门文章
- 福禄克FLUKE 435-2与438-2三相电能质量分析仪特性
- 迭代函数系统matlab实现,线性随机IFS迭代Matlab示例程序.doc
- 选股服务器列表为空 无法执行选股,东方财富客户端如何设置自动选择服务器 设置有条件选股方法...
- i513400和13400f区别 i5 13400和i5 13400f选哪个好
- 我的第一个Ai软件发布 - Super LRC Editor WIth AI
- 到哪下c语言编译器,在那里可以下载到C语言的编译器
- 用Python制作有声小说
- springmvc 下载文件ie8可用
- 新硬盘稳定性测试软件,Active@ Hard Disk Monitor 3.1硬盘检测及监控工具免费版
- java jsp 汽车销售管理系统