「视频版」当线程池溢出之后,程序会奔溃吗?面试突击 007 期

哈喽,大家好,我是老王,欢迎来到第 7 期的 Java 面试突击。

本文的面试题是,当线程池的任务溢出之后,程序会奔溃吗?

这个问题问的是关于线程池的任务数超过线程池的承载能力之后,会出现什么情况?

那么,我们本文就手撸模拟一个线程池溢出的情况,来看程序的执行情况。

涉及知识点

  1. 核心线程数和最大线程数有什么区别?

  2. 如何模拟线程池溢出?

  3. 拒绝策略的执行流程是什么?

  4. 什么是线程池的拒绝策略?

  5. Java 自带的拒绝策略有哪些?

  6. 如何自定义拒绝策略?

视频面试答案

视频内容(因为视频比较大,分成了两个视频来展示 ):

图文面试答案

当线程池的任务溢出之后,程序并不会奔溃,这时候会触发线程池的拒绝策略,Java 自带的拒绝策略有四种:

  1. AbortPolicy:终止策略,线程池终止执行,并直接抛出异常,Java 默认此拒绝策略;

  2. CallerRunsPolicy:把任务交给当前线程执行(本来是线程池自己要执行的,结果处理不过来就交给当前的主线程去处理);

  3. DiscardPolicy:忽略此任务(最新的任务);

  4. DiscardOldestPolicy:忽略最早的任务(最久的任务)。

拒绝策略的执行流程比较绕,这是因为线程池有三个重要的参数:核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程池的任务队列(BlockingQueue),大部分搞不清楚核心线程数和最大线程数有什么区别?

核心线程数是指在正常情况下线程池内的线程数量;而最大线程数指的是当线程池的任务队列存储超过最大值之后,可以创建最多的线程数量

当任务比较少的时候,线程数量会根据设置的超时时间,回归线程的数量为核心线程数量,这个时候最大线程数就暂时没用了(没有发挥的余地了)。

拒绝策略的执行流程是:当提交的任务数量大于核心线程数时,任务会被放入到线程池的任务队列中,当任务超过了最大队列值时,判断当前线程数量是否大于最大线程数,如果小于最大线程数则会新创建线程处理次任务,相反的情况下就会执行拒绝策略,如下图所示:

模拟线程池溢出

 public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1),new ThreadPoolExecutor.AbortPolicy());for (int i = 0; i < 6; i++) {executor.execute(() -> {System.out.println(Thread.currentThread().getName());});}}

程序的执行结果如下:

pool-1-thread-2

pool-1-thread-2

pool-1-thread-1

pool-1-thread-3

pool-1-thread-4

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task org.example.App$$Lambda$1/1096979270@7cca494b rejected from java.util.concurrent.ThreadPoolExecutor@7ba4f24f[Running, pool size = 4, active threads = 4, queued tasks = 1, completed tasks = 0]

at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)

at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)

at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)

at org.example.App.main(App.java:13)

从执行结果可以看出,循环在执行第 6 次就抛出异常了,这是因为最大线程数为 4,而队列最大只能存储 1 个任务,所以在第 6 个任务过来的时候,线程池已经超负荷运行了,只能执行拒绝策略了,而我们设置的拒绝策略是 AbortPolicy 所以会抛出异常。

自定义拒绝策略

除了 Java 自带的四种拒绝策略外,我们还可以自定义拒绝策略,代码如下:

public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1), new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 添加业务处理代码System.out.println("自定义拒绝策略");}});for (int i = 0; i < 7; i++) {executor.execute(() -> {System.out.println(Thread.currentThread().getName());});}
}

以上程序执行结果如下:

自定义拒绝策略

自定义拒绝策略

pool-1-thread-1

pool-1-thread-1

pool-1-thread-2

pool-1-thread-3

pool-1-thread-4

可以看出自定义拒绝策略,只需要重写 RejectedExecutionHandler 接口的 rejectedExecution 方法即可,可以在此方法中添加自己的业务处理代码。

小结

本文讲了线程池任务新增时的执行流程,先判断是否有空闲线程,如果的话直接执行任务,如果没有的话再判断任务队列是否是否饱和,如果不饱和把任务存储到队列中,如果饱和需要判断当前线程数是否大于最大线程数,如果小于则新增线程执行此任务,反之则执行拒绝策略。Java 提供了四种拒绝策略,你可以通过重写 RejectedExecutionHandler 接口来自定义拒绝策略。

更多执行细节和更多知识点说明,详见本文的视频部分。

【END】

近期热文

 

关注下方二维码,订阅更多精彩内容

朕已阅 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在python中获取浮点数的十六进制值?

浮点数的十六进制值 (Hexadecimal value of a float number) To get the hexadecimal value of a float number we use – float.hex() method, it accepts a float value and returns its hexadecimal value in string format. 要获取浮点数的十六进制值&#xff0c;我们使用–…

有人说:轻量级锁一定比重量级锁快!我忍不住笑了

世界上不止有黑白两色&#xff0c;黑与白之间还是灰色的地带。在成人的世界里&#xff0c;大多数人喜欢非黑即白的观点来看待一个问题&#xff0c;例如《十二公民》中那个刚开始所有人都认定的“一定是富二代杀S了自己的亲身父亲”&#xff0c;到最后大家理性分析和推测之后发现…

Python Django设计模式及模板层

一、Django的MTV模式 MTV代表Model - Template - View &#xff08;模型-模板-视图&#xff09;模式。 M模型层&#xff08;Model&#xff09;负责与数据交互。 T模板层&#xff08;Template&#xff09;负责呈现内容到浏览器。 V视图层&#xff08;View&#xff09;是核心&…

在Tomcat中配配置数据源汇总

为什么80%的码农都做不了架构师&#xff1f;>>> Tomcat本身不具备处理提供数据源的能力。借助于一些开源数据源实现&#xff0c;如&#xff1a;DBCP和C3P0等。 一、在http://commons.apache.org/可下载这些是Tomcat提供配置数据源所需的类库。 注意&#xff1a;Tom…

c 运算符##_C#程序演示关系运算符的示例

c 运算符##Relational operators are used to compare the values and returns Boolean values, if condition is true – they return True, otherwise they return False. 关系运算符用于比较值并返回布尔值(如果condition为true)-它们返回True &#xff0c;否则返回False 。…

Linux debian安装、配置和使用PuTTY教程

PuTTY是一个小巧、好用、免费的跨平台的访问Linux服务器的终端工具。PuTTY工具可以使用Telnet、SSH、rlogin、纯TCP以及串行接口连接服务器&#xff0c;使用非常广泛。本文主要介绍Debian系统如何安装PuTTY和如何设置该工具的字体、颜色。从而实现个性化定制自己的PuTTY工具&am…

Linux Debian安装FileZilla文件远程传输工具

一、FileZilla简介 FileZilla是一个快速、免费、跨平台的FTP软件&#xff0c;实用多功能和界面直观的FTP客户端。FileZilla是Windows&#xff0c;Linux&#xff0c;MacOSX等跨平台的图形化FTP&#xff0c;SFTP和FTPS文件管理工具。通过大量直观的工具&#xff0c;FileZilla可以…

Java 官方性能测试工具 JMH 简单入门

什么是 JMH JMH 是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。首先先明白什么是“基准测试”。百度百科给的定义如下&#xff1a; 基准测试是指通过设计科学的测试方法、测试工具和测试系统&#xff0c;实现对一类测试对象的某项性能指标…

Mybatis-Plus基础之Mapper查询

文章目录 一、简单查询二、 分页查询三、条件查询&#xff1a;WrapperWrapper 查询所有Wrapper 查询的 3 种写法一个复杂一点的例子 四、逻辑条件的组合与与和或或与或混用 五、条件为 null 的处理技巧六、设置查询列七、使用 SQL 聚合函数八、模糊查询 一、简单查询 // 根据 …

c# 赋值运算符_C#程序演示赋值运算符的示例

c# 赋值运算符Assignment operators (Assignment () and compound assignments (, -, *, /, %)) are used to assign the value or an expressions result to the left side variable, following are the set of assignment operators, 赋值运算符(Assignment( )和复合赋值( …

Linux Debian11使用国内源安装 Docker 环境

首先切换到root账户&#xff1a; su 一、Debian安装Docker 1.更新并安装一些必要系统工具。 sudo apt-get update sudo apt-get upgrade sudo apt-get install \apt-transport-https \software-properties-common \ca-certificates \curl \gnupg \lsb-release2.安装GPG证书…

HashMap 为什么在链表长度为 8 的时候转红黑树,为啥不能是 9 是 10?

这个问题是在面试某公司的时候面试官提的问题&#xff0c;当时没回答上来。归根到底还是因为自己复习基础的时候还不够仔细&#xff0c;也缺乏思考。 首先 我觉得需要确认一下&#xff0c;是不是随便什么情况下只要满足了链表长度为8就转红黑树呢&#xff1f;答案自然不是&am…

计算机网络怎么寻址_计算机网络中的无类寻址

计算机网络怎么寻址To reduce the wastage of IP addresses in blocks we subnetting. But in Classless addressing wastage of IP addresses in a block is more reduced than Classful subnetting. In this variable length, blocks are used that belongs to no class. 为了…

Linux Debian常用下载工具Transmission和qbittorrent

1.Transmission Transmission是Linux Debian系统下的系统自带的一种BitTorrent客户端下载工具&#xff0c;下载速度比较快。在Linux系统可以替代windows上的迅雷下载工具。 2.qbittorrent 使用下面命令安装&#xff1a; sudo apt-get install qbittorrent获取更多资料&#x…

《 面试又翻车了》这次竟然和 Random 有关?

小强最近面试又翻车了&#xff0c;然而令他郁闷的是&#xff0c;这次竟然是栽到了自己经常在用的 Random 上......面试问题既然已经有了 Random 为什么还需要 ThreadLocalRandom&#xff1f;正文Random 是使用最广泛的随机数生成工具了&#xff0c;即使连 Math.random() 的底层…

c#串口程序接收数据并打印_C#程序可打印各种数据类型的大小

c#串口程序接收数据并打印In this C# program – we are going to print size of various data types, to print size of a type, we use sizeof() operator. 在此C&#xff03;程序中–我们将打印各种数据类型的大小&#xff0c;并使用typeof()运算符打印类型的大小。 It acc…

Linux Debian11使用国内源安装Podman环境

一、Podman简介 Podman 是一个开源的容器运行时项目&#xff0c;可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样&#xff0c;它不需要在你的系统上运行任何守护进程&#xff0c;并且它也可以在没有 root 权限的情况下运行。 Podman 可…

二叉搜索树中第k大元素_二叉搜索树中第K个最小元素

二叉搜索树中第k大元素Problem statement: 问题陈述&#xff1a; Find the k-th smallest element in a given binary search tree (BST). 在给定的二进制搜索树(BST)中找到第k个最小的元素。 Example: 例&#xff1a; K4Kth smallest element in the above binary tree is:…

阿里巴巴Java开发手册建议设置HashMap的初始容量,但设置多少合适呢?

作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;集合是Java开发日常开发中经常会使用到的&#xff0c;而作为一种典型的K-V结构的数据结构&#xff0c;HashMap对于Java开发者一定不陌生。关于HashMap&#xff0c;很多人都对他有一些基本的了解&…

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上&#xff0c; dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题&#xff0c;比如驱动程序&#xff1b;后者一般用来分析用户态程序的问题。 一般…