面试学习整理-线程池
线程池
- 简介
- JUC包线程池介绍
- 线程池最常问也最常用-参数
- 线程执行分析-线程是怎么运行的
- 进程和线程的区别
- Executors工厂类提供四种线程池
- Executors和ThreaPoolExecutor创建线程池的区别
- 两种提交任务的方法
- spring集成的线程池
简介
线程池作为实际使用和面试较多的技能区, 学习是很有必要的
JUC包线程池介绍

Java里面线程池的顶级接口是Executor,Executor并不是一个线程
池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService
它的默认实现ThreadPoolExecutor; 静态工厂提供的线程池都基于ThreadPoolExecutor构造实现
ScheduledExecutorService() 用于周期性任务的线程池接口,ScheduledThreadPoolExecutor 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现(不重要)
线程池最常问也最常用-参数
核心线程数corePoolSize: 核心线程会一直存活,即使没有任务处理
任务队列queueCapacity: 当核心线程达到最大时, 其余任务回放在任务队列中
最大线程数maxPoolSize: 队列容量满了, 如果当前线程数小于最大线程数, 会继续创建线程处理任务
线程空闲时间keepAliveSeconds: 如果线程空闲时间达到了, 则会退出, 直到等于核心线程数, 如果允许核心线程超时, 则会最终=0
允许核心线程超时allowCoreThreadTimeOut: 如果为true, 则核心线程在存活时间到了后也会关闭
预先启动核心线程prestartAllCoreThreads: 如果为true, 则核心线程预先启动
任务拒绝策略rejectedExecutionHandler: 只有callsRunPolicy可以处理全部任务, 其余的会存在抛出任务
ThreadPoolTaskExecutor businessExecutor = new ThreadPoolTaskExecutor();businessExecutor.setCorePoolSize(5);businessExecutor.setMaxPoolSize(10);businessExecutor.setKeepAliveSeconds(60);businessExecutor.setQueueCapacity(1000);businessExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());businessExecutor.setThreadNamePrefix("businessExecutor");
线程执行分析-线程是怎么运行的
线程进入时, 如果当前线程数小于核心线程数, 则会创建线程处理
如果当前线程数大于等于核心线程数, 且任务队列未满, 则会把线程放入等待队列中
如果线程数大于等于核心线程数, 且任务队列已满
如果线程数小于最大线程数, 则创建线程
如果线程已经等于最大线程数, 则会根据队列策略处理后续线程
如果是aboutPolicy, 则抛弃之后的线程, 抛出异常
如果是discardPolicy, 也是抛弃之后的线程, 无感知
如果是discardOldPolicy, 则抛弃最早的线程, 无感知
如果是callsRunPolicy,则是不处理, 抛出线程, 使用execute方法的上层线程去处理, 让提交线程去处理任务, 会出现提交任务负反馈, 但是也给了一定时间让线程池处理线程.
进程和线程的区别
启动一个程序就会有一个进程, 程序和程序之间的通信就是进程之间的通信
一般一个接口生成一个线程, 调用程序时, 给每个请求分配一个线程去处理
Executors工厂类提供四种线程池
一般不要用,请求量大会出现oom问题
它们的底层实现都是构造ThreadPoolExecutor
newFixedThreadPool:创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
FixedThreadPool 用于负载比较重的服务器,为了资源的合理利用,需要限制当前线程数量。
newSingleThreadExecutor :创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
SingleThreadExecutor 用于串行执行任务的场景,每个任务必须按顺序执行,不需要并发执行。
newCachedThreadPool :创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,否则新建线程。(线程最大并发数不可控制)
CachedThreadPool 用于并发执行大量短期的小任务,或者是负载较轻的服务器。
newScheduledThreadPool : 创建一个定时线程池,支持定时及周期性任务执行。
ScheduledThreadPoolExecutor 用于需要多个后台线程执行周期任务,同时需要间隔执行任务
Executors和ThreaPoolExecutor创建线程池的区别
executors
newFixedThreadPool 和 newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。
newCachedThreadPool 和 newScheduledThreadPool:
主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。
ThreaPoolExecutor
正确创建线程池方式只有一种,就是走它的构造函数,参数自己指定
两种提交任务的方法
ExecutorService 提供了两种提交任务的方法:
- execute():提交不需要返回值的任务
- submit():提交需要返回值的任务
execute() 的参数是一个 Runnable,也没有返回值。因此提交后无法判断该任务是否被线程池执行成功。
submit() 有三种重载,参数可以是 Callable 也可以是 Runnable。
同时它会返回一个 Funture 对象,通过它我们可以判断任务是否执行成功。
获得执行结果调用 Future.get() 方法,这个方法会阻塞当前线程直到任务完成。
future不仅可以查看线程返回值,还可以查看线程执行状态
spring集成的线程池

spring默认提供七种线程池
最常用ThreadPoolTaskExcutor,本质上是对ThreadPoolExcutor的包装
只需要加@Autowired就可以使用
该线程池的默认线程数量为设备的CPU核心数,8核则8线程,16核则16线程,可以通过配置更改。
/** spring 提供的线程池 */
@Autowired
private ThreadPoolTaskExecutor poolTaskExecutor;
异步默认使用的是simpleAysncTaskExcutor,单线程异步线程,每个请求创建一个线程,所以异步线程需要重写线程池
还有concurrentTaskExcutor ,simpleThreadPoolTaskExcutor 等不常用
相关文章:
面试学习整理-线程池
线程池 简介JUC包线程池介绍线程池最常问也最常用-参数线程执行分析-线程是怎么运行的进程和线程的区别Executors工厂类提供四种线程池Executors和ThreaPoolExecutor创建线程池的区别两种提交任务的方法spring集成的线程池 简介 线程池作为实际使用和面试较多的技能区, 学习是…...
Debian会取代CentOS成为更主流的操作系统吗?
我们知道,其实之前的话,国内用户对centos几乎是情有独钟的偏爱,很多人都喜欢选择centos系统,可能是受到一些原因的影响导致的吧,比如他相当于免费的红帽子系统,或者一些教程和网上的资料都推荐这个系统&…...
网络安全领域推荐证书介绍及备考指南
在网络安全领域,拥有专业认证不仅可以证明个人的专业能力,还能帮助在实际工作中应用先进的技术和知识。以下是几种热门的网络安全证书介绍及备考指南。 1. OSCP (Offensive Security Certified Professional) 证书简介 OSCP是针对渗透测试领域的入门级…...
SpringBoot项目ES6.8升级ES7.4.0
SpringBoot项目ES6.8.15 升级到 ES7.4.0 前言 由于公司内部资产统一整理,并且公司内部部署有多个版本的es集群,所以有必要将目前负责项目的ES集群升级到公司同一版本7.4.0。es6到es7的升级变化还是挺大的,因此在这里做一下简单记录…...
深度学习 之 模型部署 使用Flask和PyTorch构建图像分类Web服务
引言 随着深度学习的发展,图像分类已成为一项基础的技术,被广泛应用于各种场景之中。本文将介绍如何使用Flask框架和PyTorch库来构建一个简单的图像分类Web服务。通过这个服务,用户可以通过HTTP POST请求上传花朵图片,然后由后端…...
MFC工控项目实例二十六创建数据库
承接专栏《MFC工控项目实例二十五多媒体定时计时器》 用选取的型号为文件名建立文件夹,再在下面用测试的当天的时间创建文件夹,在这个文件中用测试的时/分/秒为数据库名创建Adcess数据库。 1、在StdAfx.h文件最下面添加代码 #import "C:/Program F…...
springmvc源码流程解析(一)
Springmvc 是基于servlet 规范来完成的一个请求响应模块,也是spring 中比较大的一个 模块,现在基本上都是零xml 配置了,采用的是约定大于配置的方式,所以我们的springmvc 也是采用这种零xml 配置的方式。 要完成这种过程ÿ…...
【论文阅读】SRGAN
学习资料 论文题目:基于生成对抗网络的照片级单幅图像超分辨率(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network)论文地址:https://arxiv.org/abs/1609.04802代码:GitHub - xiph/daala: Modern video compression for the interne…...
kubelet PLEG实现
概述 kubelet的主要作用是确保pod状态和podspec保持一致,这里的pod状态包括pod中的container状态,个数等。 为了达到这个目的,kubelet需要从多个来源watch pod spec的变化,并周期从container runtime获取最新的container状态。比如…...
leetcode49:字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…...
一个将.Geojson文件转成shapefile和kml文件的在线页面工具(续)
接上一专栏:这个网址有个bug,每个月只能免费转3次,这等于没用! 一个将.Geojson文件转成shapefile和kml文件的在线页面工具_geojson转shp在线-CSDN博客 下面这个网址实测可以免费多次转换! Quickmaptools : Geojson to…...
论文阅读(二十四):SA-Net: Shuffle Attention for Deep Convolutional Neural Networks
文章目录 Abstract1.Introduction2.Shuffle Attention3.Code 论文:SA-Net:Shuffle Attention for Deep Convolutional Neural Networks(SA-Net:置换注意力机制) 论文链接:SA-Net:Shuffle Attention for Deep Convo…...
基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】
背景及意义 智能道路裂缝检测与分析系统在基础设施维护和安全监测方面起着非常重要的作用。道路裂缝是道路衰老和破坏的早期迹象,若不及时发现和修复,可能会导致道路结构的进一步恶化,甚至引发安全事故。本文基于YOLOv8深度学习框架ÿ…...
YOLOv11入门到入土使用教程(含结构图)
一、简介 YOLOv11是Ultralytics公司在之前的YOLO版本上推出的最新一代实时目标检测器,支持目标检测、追踪、实力分割、图像分类和姿态估计等任务。官方代码:ultralytics/ultralytics:ultralytics YOLO11 🚀 (github.com)https://g…...
python 爬虫抓取百度热搜
实现思路: 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…...
3.1 > Linux文件管理(基础版)
Linux 的命名规则 相对于其他操作系统(如 Windows )来说,Linux 的命名规则并没有那么多条条框框,还算是比较自由的。在 Linux 中,它的命名规则有如下几点要求: 首先是大小写敏感:例如在 Linux…...
CTFHUB技能树之文件上传——MIME绕过
开启靶场,打开链接: 直接指明是MIME验证 新建04MIME.php文件,内容如下: <?php echo "Ciallo~(∠・ω< )⌒★";eval($_POST[pass]);?> (这里加了点表情,加带点私货&#x…...
4种鼓励创业创新的方法
随着市场趋于饱和,许多企业,尤其是初创企业,很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新,从员工到品牌皆如此。 那么究竟如何…...
C#中的LINQ之美:优雅的数据查询与操作
LINQ(Language Integrated Query,语言集成查询)是C#中一个强大的工具,它将查询功能直接融入到语言中,使开发者能够以一种更直观、更接近自然语言的方式来操作数据。LINQ不仅能极大地提高开发效率,而且让代码…...
深入浅出:深度学习模型部署全流程详解
博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾: 【论文精读】PSAD:小样本部件分割揭示工业异常检测的合成逻辑每日一言🌼: 生活要有所期待, 否则就如同罩在…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
