#详细介绍!!! 线程池的拒绝策略(经典面试题)

本篇单独讲解线程池的拒绝策略,介绍了当线程池任务满了之后,线程池会以什么样的方式来响应添加进来的任务

目录

一:理解线程池拒绝策略的触发情况+代码理解

二:线程池的四种常见的拒绝策略

1.ThreadPoolExecutor.AbortPolicy

2.ThreadPoolExecutor.CallerRunsPolicy

3.ThreadPoolExecutor.DiscardOldestPolicy

4.ThreadPoolExecutor.DiscardPolicy 



一:理解线程池拒绝策略的触发情况+代码理解

当线程池容纳不了任务的时候,则会触发线程池的拒绝策略

线程池能同时容纳的任务数量:最大线程数+任务队列能存储的任务数

看代码理解:

public static void main(String[] args) {
        BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()) ;

        //此时线程池只有一个核心线程,且队列也只能存储一个任务
        //当我们添加第三个任务时,没地放了,此时会根据最大线程数来新建临时线程执行这个线程,此时创建了一个临时线程执行任务3
        //如果我们再添加任务四:此时最大线程数和存储的队列加起来只能拿到三个任务,那么此时任务四就没地方存储了
        //此时就会触发线程池的拒绝策略
        for (int i = 1; i <= 4; i++) {
            int num = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        System.out.println("正在执行线程"+num);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }
    }

此处创建了一个线程池pool,核心线程数为1,最大线程数为2,任务队列的长度为1

设置线程池的拒绝策略为ThreadPoolExecutor.AbortPolicy

运行结果:

       

详解: 

1.当添加第1个任务进线程池执行的时候,此时线程池直接创建核心线程来执行任务

2.当添加第2个任务进线程池执行的时候,此时还有存储空间,那么第2个任务进去任务队列,等待核心线程执行完毕再弹出任务2进行执行

3.当添加第3个任务进线程池执行的时候,此时核心线程在执行任务1,而任务队列又被任务2给占满了,那么任务3没地方去了,但此时线程数量还没到线程池的最大线程数,这个时候会自动创建临时线程来执行任务3,把任务3给拿走,避免任务3流失

4.当添加第4个任务进线程池执行的时候:此时核心线程数被占用,任务队列和最大线程数都满了,那么此时任务4彻底没地方去了,线程池只能被迫采用拒绝策略来处理当前问题

二:线程池的四种常见的拒绝策略

首先打开官方文档

        可查看到以下四种策略:

1.ThreadPoolExecutor.AbortPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()) ;

这种拒绝策略表示:当线程池最大的任务容量已满时,编译器直接抛出异常

上诉代码就是这种情况

通俗理解:

就好像在说,这个问题编译器傻眼了,处理不了,编译器给你一个异常你自己看着办。

2.ThreadPoolExecutor.CallerRunsPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.CallerRunsPolicy()) ;

这种拒绝策略表示:当线程池最大的任务容量已满时,线程池不处理该任务,让添加该任务的线程自己执行

例如前面代码案例如果设置为这个拒绝策略,那么是main线程添加任务4进线程池被拒绝了,此时main线程自己执行任务4

通俗理解:

我把一个任务交给你执行,你自己也没空闲时间,所以你让我自己去做这个任务

3.ThreadPoolExecutor.DiscardOldestPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardOldestPolicy) ;

把前面例子改变一下:设置拒绝策略为DiscardOldestPolicy

        并且把代码的死循环改为执行3秒

public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardOldestPolicy()) ;

        //此时线程池只有一个核心线程,且队列也只能存储一个任务
        //当我们添加第三个任务时,没地放了,此时会根据最大线程数来新建临时线程执行这个线程,此时创建了一个临时线程执行任务3
        //如果我们再添加任务四:此时最大线程数和存储的队列加起来只能拿到三个任务,那么此时任务四就没地方存储了
        //此时就会触发线程池的拒绝策略
        for (int i = 1; i <= 4; i++) {
            int num = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    boolean start = true;
                    long time = System.currentTimeMillis();
                    while(start){
                        System.out.println("正在执行线程"+num);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if(System.currentTimeMillis() - time >= 3000){
                            start = false;
                        }
                    }

                }
            });
        }
    }

此时代码结果:

 

这种拒绝策略表示:当线程池最大的任务容量已满时,线程池拒绝(删除掉)最老的任务,再把当前任务添加进线池

例如前面代码案例如果设置为这个拒绝策略,那么线程池就把任务队列中最早添加的(最老的)的任务2给删除,再把任务4添加进线程池

通俗理解:

我把任务交你执行,你手底下也有很多任务也没时间做,此时你放下把后续任务中的最早添加的任务给剔除,再把新任务加入后续执行的任务中

4.ThreadPoolExecutor.DiscardPolicy 

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardPolicy ) ;

这种拒绝策略表示:当线程池足底啊的任务容量已满时,线程池拒绝最新添加的任务

 例如前面代码案例如果设置为这个拒绝策略,那么线程池就直接拒绝任务4,不接收任务4

通俗理解:

我把任务交你执行,你手底下也有很多任务也没时间做,此时你直接拒绝这个任务,不做这个任务,那么这个任务就流失了


 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring6】| GoF之代理模式(静态代理和动态代理)

目录 一&#xff1a;GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一&#xff1a;GoF之代理模式 1. 对代理模式的理解 生活场景1&#xff1a;牛村的牛二看上了隔壁村小花&#xff0c;牛二不好意思直接找小花&#xff…

内网渗透之某后渗透利用【网络安全】

0x01 工具介绍 工具原理 Mimikatz 的主要原理是在 Windows 系统中用户登录后系统会将身份凭证存储于lsass.exe进程的内存当中&#xff0c;Mimikatz 通过注入lsass.exe进程读取进程内存&#xff0c;从中获取对应的明文密码。 常见问题 在 Windows Vista 系统之后不再存储 LM…

0203优先级下的调度问题_环_拓扑排序-有向图-数据结构和算法(Java)

1 概述 在和有向图相关的实际应用中&#xff0c;有向环特别的重要。在实际应用中&#xff0c;一般只会重点关注其中的一小部分&#xff0c;或者只想知道它们是否存在。 2 调度问题 一种应用广泛的模型是给定一组任务并安排它们的执行顺序&#xff0c;限制条件是这些任务的执…

机器学习:逻辑回归模型算法原理(附案例实战)

机器学习&#xff1a;逻辑回归模型算法原理 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#…

Github学生包申请秒过经验并使用Copilot

写在前面 前提是在校学生&#xff0c;且有学校邮箱&#xff0c;当然你也得有Github账户前往学信网下载 教育部学籍在线验证报告将报告转换成英文版本&#xff0c;我用的是手机夸克自带的拍照翻译功能 具体流程 设置Github个人信息 来到 https://github.com/settings/profil…

如何用Postman做接口自动化测试?没有比这个更详细的了

目录 前言 什么是自动化测试 自动化测试有哪些分类 为什么需要自动化测试 Postman自动化测试演示 1.新建集合 2.新建接口 3.填写自动化测试脚本 4.录入所有接口 5.执行自动化测试 前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 …

腾讯Coding平台学习笔记二:自定义团队插件的使用方法

目录一、前言二、系统环境三、工作目标四、流水线设置五、开发工具5.1 教程地址5.2 开发工具程序结构5.3 qciplugin.yml文件5.4 main.py文件六、插件的安装6.1 打包成zip6.2 上传zip包6.3 构建新插件6.4 质量门禁7、流水线设置7.1 添加质量管理阶段节点7.2 添加其它动作八、流水…

cookie和session的原理以及在Servlet中的应用

文章目录简介cookiecookie的实质及实现原理cookie在Servlet的应用sessionsession的实质及实现原理session在Servlet中的应用HttpServletRequest&#xff0c;Session&#xff0c;ServletContext简介 cookie保存在客户端&#xff0c;session保存在服务器端。二者均用于描述会话的…

【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”

【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第一大问代码分享&#xff08;后续更新LSTMinformer多元预测多变量模型&#xff09; PS: 代码全写有注释&#xff0c;通俗易懂&#xff0c;包看懂&#xff01;&#xff01;&#xff01;&…

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…

Transformer在计算机视觉中的应用-VIT、TNT模型

上期介绍了Transformer的结构、特点和作用等方面的知识&#xff0c;回头看下来这一模型并不难&#xff0c;依旧是传统机器翻译模型中常见的seq2seq网络&#xff0c;里面加入了注意力机制&#xff0c;QKV矩阵的运算使得计算并行。 当然&#xff0c;最大的重点不是矩阵运算&…

【数据结构】树的概念

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

网络基础认识

目录 一、计算机网络背景 1.1 网络发展 1.2 "协议"由来 二、网络协议初识 2.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层模型 三、网络协议栈 四、数据包封装与分用 五、网络传输基本流程 5.1 同局域网的两台主机通信 5.2 跨网络的两台主机通信 六、网络…

MySQL高级第六篇:数据库性能分析与优化

MySQL高级第六篇&#xff1a;数据库性能分析与优化一、数据库服务器优化步骤概述二、慢查询日志&#xff1a;记录执行慢的SQL1. 开启慢查询日志2. 设置long_query_time3. 查看慢查询数与慢查询SQL三、分析查询语句&#xff1a;EXPLAIN1. 概述2.EXPLAIN各列的含义一、数据库服务…

【leetCode189】轮转数组

作者&#xff1a;日出等日落 专栏&#xff1a;leetCode刷题训练 要成功不需要什么特别的才能&#xff0c;只要把你能做的小事做得好就行了。 ——维龙 目录 题目&#xff1a; 第一种方法&#xff1a; 第二种方法&#xff1a; 第三种方法&#xff1a; 今…

UDP、TCP三次握手和四次挥手

-----UDP与TCP----- 相同点 tcp、udp都是工作在传输层进行数据传输&#xff08;二进制标识文本或者视频或者图片&#xff09; 不同点 tcp基于连接&#xff0c;保障传输的安全udp基于非连接&#xff0c;保障传输的速度 -----TCP的三次握手----- 过程 为什么不是两次握手&a…

PMP考试备考:你不知道的8个常考概念

PMP考试即将到来&#xff0c;为便于广大考生在考试前查漏补缺&#xff0c;给大家准备了PMP考试中常考的八个重要概念&#xff0c;包括敏感性分析、德尔菲技术等&#xff0c;快来看看吧。 01敏感性分析 敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它有助于理解项…

UWB芯片DW3000之双边双向测距法

目录 双边双向测距 使用四个信息 使用三个信息 双边双向测距 使用四个信息 双边双向测距(DS-TWR)是基本的单边双向测距的扩展&#xff0c;其中使用两次往返时间测量并结合给出飞行时间结果&#xff0c;即使在相当长的响应延迟情况下也能减少误差。 带有四个信息的双面双向…

安全多方计算之八:Mix-Match

Mix-Match1. 混合网络基于ElGamal加密方案的混合网络2. PET协议3. Mix-Match协议4. 百万富翁问题的Mix-Match解决方案M.Jakobsson和A.Juels提出了基于Mix-Match的安全多方计算协议构造方法&#xff0c;该类协议包括Mix与Match两个阶段&#xff1a; Mix阶段&#xff1a;通过构造…

详解LinkedHashSet和LinkedHashMap

目录 一.LinkedHashSet和LinkedHashMap 1.基本介绍 2.与HashSet和HashMap的区别 3.LinkedHashSet和LinkedHashMap具体的方法 1.LinkedHashSet 2.LinkedHashMap 二.模拟代码实现LinkedHashMap 三.具体应用 一.LinkedHashSet和LinkedHashMap 1.基本介绍 顾名思义,根据名…