Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

Wesley13
• 阅读 685

Java多线程之线程池7大参数详解
目录
企业面试题
线程池7大参数源码
线程池7大参数详解
底层工作原理详解
线程池的4种拒绝策略理论简介
面试的坑:线程池实际中使用哪一个?
1. 企业面试题
线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最
后问阻塞队列用是什么?
线程池的构造类的方法的5个参数的具体意义?使用无界阻塞队列会出现什么问题?
线程池用过么?都有什么参数?底层是如何实现的?
2. 线程池7大参数源码
通过下图线程池源码可知,线程池有7个参数,但一般只问前5个:

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

3. 线程池7大参数详解
corePoolSize:线程池中的常驻核心线程数

在创建了线程池后,当有请求任务来之后,就会排池中的线程去执行请求任务,近似理解为今日当值线程。
当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。
maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1

keepAliveTime:多余的空闲线程的存活时间

当空闲时间达到keepAIiveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止
unit:keepAIiveTime的单位

workQueue:任务队列,被提交但尚未被执行的任务。

threadFactory: 表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。

handIer:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)

4. 底层工作原理详解
线程池底层示例图

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

线程池的主要处理流程

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

3. 详细过程
在创建了线程池后,等待提交过来的任务请求。

当调用execute()方法添加一个请求任务时,线程池会做如下判断:
2.1 如果正在运行的线程数量小于corePoolSi,那么马上创建线程运行这个任务:
2.2 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列;
2.3 如果这时候队列满了且正在运行的线程数量还小maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务:
2.4 如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝略来执行。

当一个线程完成在务时,它会从队列中取下一个任务来执行。

当一个线程无事可做超过一定的时间(keepAliveTime)时,线程池会判断:
4.1 如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后它最终会收縮到corePoolSize的大小。

5. 线程池的4种拒绝策略理论概述
拒绝策略概述:等待队列已经满了,再也塞不下新任务了,同时,线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理处理这个问题。

4种JDK内置拒绝策略

AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。
CallerRunsPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。
DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。
以上内置拒绝策略均实现了RejectedExecutionHandler接口

6. 面试的坑:线程池实际中使用哪一个?
面试坑:你在工作中单一的/固定数的/可变的三种常见线程池的方法,你用哪个多?

答案:是一个都不用。

会接着问: Executors中JDK已经给你提供了,为什么不用?

这些答案可以通过《阿里巴巴Java开发手册》找到,如下

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java 面试知识点笔记(十三)多线程与并发
java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.
Wesley13 Wesley13
2年前
java_线程池
血一样的教训,今天上午参加了一家现场面试java。在这之前,我一直认为我的java基础还是可以的,而今天一问三不知。现在将面试的问题整理出来一、说说java中的线程池?  1.线程池:线程池是线程的集合,不用自己创建线程,把线程直接给线程池,由线程池处理。   2.过程:首先,使用线程池可以重复利用已有的线程继续执行任务,避免线程在
Wesley13 Wesley13
2年前
java各种面试问题
二、Java多线程相关线程池的原理,为什么要创建线程池?创建线程池的方式;线程的生命周期,什么时候会出现僵死进程;说说线程安全问题,什么实现线程安全,如何实现线程安全;创建线程池有哪几个核心参数?如何合理配置线程池的大小?volatile、ThreadLocal的使用场景和原理;
Easter79 Easter79
2年前
springboot+线程池使用
关于线程和线程池的学习,我们可以从以下几个方面入手:第一,什么是线程,线程和进程的区别是什么第二,线程中的基本概念,线程的生命周期第三,单线程和多线程第四,线程池的原理解析第五,常见的几种线程池的特点以及各自的应用场景一、什么是线程线程,程序执
利用DUCC配置平台实现一个动态化线程池
在后台开发中,会经常用到线程池技术,但线程池核心参数的配置很大程度上依靠经验,所以我们很难一劳永逸地规划一个合理的线程池参数。本文以公司DUCC配置平台作为中心,以修改线程池核心线程数、最大线程数为例,实现一个简单的动态化线程池。
zdd小小菜鸟 zdd小小菜鸟
1年前
多线程面试
多线程篇1.为什么要使用线程池tex避免频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。2.java中如何获取到线程dump文件tex死循环、死锁、阻
Wesley13 Wesley13
2年前
01.Android线程池实践基础
目录介绍01.实际开发问题02.线程池的优势03.ThreadPoolExecutor参数04.ThreadPoolExecutor使用05.线程池执行流程06.四种线程池类07.execute和submit区别08.线程池的使用技巧01.实际开发问题
Wesley13 Wesley13
2年前
Java多线程之线程池的手写改造和拒绝策略
目录自定义线程池的使用四种拒绝策略代码体现1\.自定义线程池的使用自定义线程池(拒绝策略默认AbortPolicy)publicclassMyThreadPoolDemo{  publicstaticvoidmain(Stringargs){    ExecutorSe
Stella981 Stella981
2年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Wesley13 Wesley13
2年前
Java多线程之线程池
 newFixedThreadPool:固定线程池,核心线程数和最大线程数固定相等,而空闲存活时间为0毫秒,说明此参数也无意义,工作队列为最大为Integer.MAX\_VALUE大小的阻塞队列。当执行任务时,如果线程都很忙,就会丢到工作队列等有空闲线程时再执行,队列满就执行默认的拒绝策略 newCachedThreadPool:带缓冲