【后端面经-java】java线程池满的处理策略

news2024/11/20 3:36:11

【后端面经-java】java线程池满的处理策略

    • 1. 线程池介绍
      • 1.1 基本作用
      • 1.2 处理流程
      • 1.3 线程池大小设置
      • 1.4 线程池参数
    • 2. 线程池满的处理策略
      • 2.1 默认--拒绝策略handler
    • 3. 参考资料

1. 线程池介绍

1.1 基本作用

对多个线程使用的资源进行集中管理。

  • 降低资源消耗:
    • 复用线程,降低线程创建和销毁造成的消耗;
  • 线程资源管理
    • 提高管理效率;
  • 提高线程的响应速度
    • 在线程池中随时等待被执行,CPU不用等到线程创建时间;

1.2 处理流程

当一个线程进入线程池之后,会进行如下的处理步骤:

  • 首先查看核心线程池是否满

    • 如果没满,线程将在此处等待被调度执行;
  • 如果核心线程池满了,那么查看队列是否满了

    • 如果没满,线程在这里等待进入核心线程池;
  • 如果队列也满了,那么查看临时线程池是否满了

    • 如果没满,创建临时线程来处理任务。
  • 如果临时线程池也满了,那就要根据2.线程池满的处理策略进行线程处理。
    如下图所示:
    在这里插入图片描述

当调度者需要调度一个线程的时候,按照如下步骤:

  • 核心线程池中获取一个线程,执行任务;
  • 如果线程处于等待态,获取下一个线程继续执行;
  • 某一个任务执行完毕后,线程返回就绪态而不是终止态,放入线程池中复用。

1.3 线程池大小设置

  • CPU操作密集的任务

    • 由于线程操作多半需要占据CPU资源,因此一个线程运行的过程中基本上很少会出现某一线程进入等待态而调度下一个线程的情况;
    • 因此CPU调度线程的速度偏慢,因此线程池大小不应过大,一般为CPU核心数+1;这样可以保证CPU的效率最高;
    • 如果线程池容量过大,那么不仅对CPU运行是一个很大的负担,而且大量线程都处于等待运行的阶段,等待时间过长,可能出现响应过慢的情况。
  • I/O操作密集的任务

    • 对于I/O操作密集的任务,线程对于CPU的资源占用常常被I/O等操作打断,此时线程进入等待态,CPU继续调度下一个线程;
    • CPU调度线程的速度偏快,线程池大小可以尽量大一点,这样能够保障CPU资源的利用率,提高线程执行效率;
    • 如果线程池容量过小,CPU在调度一段时间之后,所有线程都进入等待态,此时就会出现CPU空等的情况,不利于资源有效利用。
  • 注意

  • 对于就绪态等待态等线程状态和生命周期的介绍,可参考这篇博客

1.4 线程池参数

线程池的构造方法如下所示:

public ThreadPoolExecutor(int corePoolSize,
                        int maximumPoolSize,
                        long keepAliveTime,
                        TimeUnit unit,
                        BlockingQueue<Runnable> workQueue,
                        ThreadFactory threadFactory,
                        RejectedExecutionHandler handler);

线程池的创建包含以下参数:

  • corePoolSize:核心线程池容量大小
    • 如前文所述,线程进行核心线程池即可等待调度执行
  • maximumPoolSize:最大线程池大小
    • 通过这个来判断线程池是否已满。
      MaximumPoolSize = CorePoolSize + WorkQueue + 临时线程池大小
      
  • workQueue:任务队列
    • 无法进入核心线程池的线程将进入任务队列等待进入池中;
    • 阻塞队列对象,一般需要设定容量大小
  • keepAliveTime:线程存活时间
    • 线程池已满的情况下,空闲多余的线程有个存活时间,超过这个时间还没有进入核心线程池,那么将被丢弃;
  • timeUnit:线程存活时间单位
    • 配合线程存活时间使用;
  • handler:拒绝策略
    • 当前线程池满了之后(超过maxmumPoolSize),对于新的线程的处理策略,
    • 包括四种,在2.1 默认--拒绝策略handler有详细论述
  • threadFactory:线程工厂
    • 用于创建线程池中的线程。

2. 线程池满的处理策略

2.1 默认–拒绝策略handler

线程池满了之后,一般的处理方式是丢弃某一线程,并且抛出异常。
Handler有四种策略:

  • AbortPolicy:直接抛出异常RejectedExecutionException
  • DiscardPolicy:直接丢弃任务,但是不抛出异常( 默认)。
  • DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新尝试执行任务;
  • CallerRunsPolicy:由调用线程处理该任务。

3. 参考资料

参考博客-1
参考博客-2
参考博客-3
参考博客-4

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

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

相关文章

【数据挖掘实战】——科大讯飞:跨境广告ROI预测(Baseline)

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

前端Vue自定义列表表格信息展示可用于商品规格参数展示

前端Vue自定义列表表格信息展示可用于商品规格参数展示 &#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13131 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- table-list:表格数组 数组里对象可自定义字段 …

Kubernetes 和 Prometheus

资源监控系统是容器编排系统必不可少的组件&#xff0c;也是服务治理的核心之一。而 Prometheus 本质上是一个开源的服务监控系统和时序数据库&#xff0c;是 CNCF 起家的第二个项目&#xff0c;目前已经成为 Kubernetes 生态圈中的监控系统的核心。 Prometheus 的核心组件 Pro…

Run in PaddleX 2.0,一站式搞定飞桨精选模型开发全流程!

2020年4月&#xff0c;飞桨推出了 PaddleX 全流程开发工具&#xff08;以下简称 PaddleX 1.0 系列&#xff09;&#xff0c;其在社区收获了广泛的影响力。PaddleX 1.0 系列采用本地单机版的方式&#xff0c;将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通…

【支付系统】如何生成订单号

通常我们都会用数据库中的主键作为订单号,而id的生成方式又以自增,uuid,雪花id最为常见.但是这些并不适合作为订单号.订单号一般要体现出年月日等信息.方便快速定位是哪个时间的订单.如果我们直接使用时间作为id,会有重复的可能.这里就给大家介绍一种最为简单的一种方式. 时间自…

企业进销存管理系统的设计与实现_kaic

摘 要 企业的进销存管理系统在日常经营过程中起着至关重要的作用&#xff0c;直接影响产品生产 的成本、进度、质量和企业效益。本论文项目以某化工企业对进销存管理系统的需求为 背景&#xff0c;针对企业存在的部门运作独立、信息资源共享度低等造成的进销存管理低率低下、 有…

【console】console用法大全:

文章目录 一、console.log普通信息/console.info提示性信息/console.error错误信息/console.warn警示信息二、console.time()和console.timeEnd()>查看执行所用时间三、console.group()和console.groupEnd()>让控制台输出的语句产生不同的层级嵌套关系四、console.profil…

什么是HTTP 500内部服务器错误,要怎么修复

HTTP 500是一种原始的错误代码&#xff0c;它指示网站服务器在处理请求时发生了内部错误&#xff0c;不过具体错误原因是不确定的。一般情况下&#xff0c;这种错误通常是由服务器程序上的bug或者配置问题造成的。当服务器收到请求时&#xff0c;尝试执行它时&#xff0c;但是发…

使用径向基函数(RBF)神经网络对我们自己的excel数据进行分类---包括详细的python代码,RBFRegressor

文章目录 一、 径向基神经网络&#xff08;Radial Basis Function Neural Network&#xff09;是什么&#xff1f;二、径向基函数(RBF)神经网络对我们自己的excel数据进行分类---包括详细的python代码总结 一、 径向基神经网络&#xff08;Radial Basis Function Neural Networ…

Go 将引入标准库 v2 版本,首个动手的是:math/rand/v2!

大家好&#xff0c;我是煎鱼。 最近 Go 核心团队负责人 Russ Cox&#xff08;下称&#xff1a;rsc&#xff09;发起了一项 “讨论”。希望正式开启 Go 标准库的 v2 版本&#xff0c;相当于老树发新芽了。 Go 标准库升级 v2 原因 这次会发起这个提案的最直接原因是&#xff1a;我…

编译原理笔记8:语法分析(2)上下文无关文法 CFG

目录 CFG 概述及其四元组表示产生式集合表示 CFGCFG&#xff0c;用推导&#xff0c;产生语言直接推导由 CFG 产生语言在&#xff1f;为啥从右往左叫规范&#xff1f;凭什么歧视左&#xff1f; 总结一下这些奇奇怪怪的东西 前几篇博客中说到的词法分析&#xff0c;做的是从 【xy…

驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库&#xff0c;用于存储系统和应用程序的设置信息&#xff0c;注册表是一个巨大的树形结构&#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用&#xff0c;而在内核中读写注册表则需要使用内核装用API函数&#xff0c;如…

Spring Cloud灰度部署

1、背景(灰度部署) 在我们系统发布生产环境时&#xff0c;有时为了确保新的服务逻辑没有问题&#xff0c;会让一小部分特定的用户来使用新的版本&#xff08;比如客户端的内测版本&#xff09;&#xff0c;而其余的用户使用旧的版本&#xff0c;那么这个在Spring Cloud中该如何…

第五届双态IT北京用户大会回顾 | 基于运维数据治理的数智化转型

专题演讲人&#xff1a;擎创科技CTO 葛晓波 文末附有本场专题演讲视频 ●前言 各行业的云原生发展程度各有不同&#xff0c;并不是所有业务应用都适合云原生的形态&#xff0c;如若过度追求云原生化反而会使得企业运维压力骤增&#xff0c;运维成本激增。 从数字化转型的角度…

软考:软件工程:软件定义,特点,软件生命周期,软件危机,软件开发模型

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

C++——vector容器模拟实现

目录 1. 基本成员函数 2. 默认成员函数 2.1 构造函数 2.2 析构函数 2.3 拷贝构造函数 2.4 赋值运算符重载函数 3. 容器访问相关函数 3.1 operator[ ]运算符重载 3.2 迭代器 3.3 范围for 4. vector空间增长问题 4.1 vector 容量和大小 4.2 vector扩容 4.3 重新定义…

均匀B样条采样从LiDAR数据中快速且鲁棒地估计地平面

文章&#xff1a;Fast and Robust Ground Surface Estimation from LiDAR Measurements using Uniform B-Splines 作者&#xff1a;Sascha Wirges, Kevin Rsch, Frank Bieder and Christoph Stiller 编辑&#xff1a;点云PCL 代码&#xff1a; https://github.com/KIT-MRT/poin…

全志V3S嵌入式驱动开发(编译器升级到7.5)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 看过我们文章的朋友都知道&#xff0c;前面为了做v3s的驱动&#xff0c;对linux kernel进行了两次升级。第一次升级是从4.10.y升级到4.14.y&#x…

【Python】open打开文件出现的错误解决

一、Python中关于打开open打开文件出现的错误解决 &#xff08;第一种&#xff09;UnicodeDecodeError: ‘utf-8’.......... &#xff08;第二种&#xff09;UnicodeDecodeError: ‘gbk’......... 二、问题解决 两种解决方式针对不同错误&#xff0c;实际应用中可以都试试…

PCB设计实验|第五周|LED显示电路PCB库设计|3月27日

目录 实验四 LED显示电路PCB库设计 一、实验原理 二、实验环境 三、实验结果 四、实验总结 实验四 LED显示电路PCB库设计 一、实验原理 LED(Light- Emitting-Diode中文意思为发光二极管)是一种能够将电能转化为可见光的半导体&#xff0c;它改变了白炽灯钨丝发光与节能…