java的线程池介绍

什么是线程池?

线程池是一种用于管理和复用线程的机制,旨在减少线程的创建和销毁次数,提高线程的可重用性和执行效率。通过线程池,可以控制线程的数量、数量大小以及线程的执行方式,从而更加有效地处理并发任务。

线程池的好处?

  1. 降低系统开销:减少了线程的创建和销毁次数,减少了系统资源的开销。
  2. 提高响应速度:线程池中的线程预先创建好,可以立即执行任务,提高了系统的响应速度。
  3. 精细的调优:可以通过配置线程池的参数,如核心线程数、最大线程数、任务队列等,来灵活地控制线程执行的规模和调度方式。

常用的线程池?

1、FixedThreadPool(固定大小线程池)

  • 固定大小的线程池,线程数量一旦达到设定的核心线程数,就保持不变。
  • 如果有任务提交时,如果空闲线程可以处理,则立即处理;如果没有空闲线程,则任务进入队列等待。
  • 适用于需要限制线程数量的场景,比如数据库连接池等。

2、CachedThreadPool(缓存线程池)

  • 线程数量根据需要自动调整,没有核心线程,最大线程数为 Integer.MAX_VALUE。
  • 如果有空闲线程可用,则复用空闲线程;没有则动态创建新线程。
  • 适用于执行大量短期异步任务的场景。

3、SingleThreadPool(单线程池)

  • 只有一个线程在工作,保证所有任务按照指定顺序执行。
  • 如果这个线程异常结束,会创建一个新的线程代替它,保证顺序执行。
  • 适用于需要顺序执行任务的场景。

4、ScheduledThreadPool(定时任务线程池)

  • 用于执行定时任务和周期性任务。
  • 可以指定核心线程数量,可以根据需要动态调整线程数量。

线程池的七个参数?

1、核心线程数(corePoolSize)

  • 核心线程数指的是线程池中保持存活的线程数量,即使线程处于空闲状态也会保持存活,除非设置了允许核心线程超时。

2、最大线程数(maximumPoolSize)

  • 最大线程数表示线程池中最大允许存在的线程数量,当任务达到一定数量时,线程池会创建新的线程来处理任务,直到达到最大线程数为止。

3、线程空闲时间(keepAliveTime)

  • 线程空闲时间表示当线程处于空闲状态时,等待新任务的最长时间,超过这个时间会被回收销毁,只保留核心线程数的线程。也称为线程的存活时间。

4、时间单位(unit)

  • 时间单位用来指定 keepAliveTime 的单位,可以是秒、毫秒等。

5、工作队列(workQueue)

  • 工作队列用来存储线程池等待执行的任务,有不同的实现方式,如 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。

6、线程工厂(threadFactory)

  • 线程工厂用来创建新线程,可以自定义线程工厂来为线程池创建定制化的线程。

7、拒绝策略(handler)

拒绝策略用来指定当任务无法被线程池执行时的处理方式,有多种预定义的策略可供选择,默认是 AbortPolicy。一共有四种拒绝策略:

  • AbortPolicy(中止策略)

        默认的拒绝策略。当线程池无法接受新任务时,会抛出 RejectedExecutionException 异常通知调用者任务无法继续提交。

  • CallerRunsPolicy(调用者运行策略)

        如果线程池无法接受新任务,则由主线程(提交任务的线程)自己执行这个任务。这种策略不会抛弃任务,而是直接在主线程中执行。

  • DiscardPolicy(丢弃策略)

        当线程池无法接受新任务时,不做任何处理,直接丢弃无法执行的任务。

  • DiscardOldestPolicy(丢弃最老的任务策略)

        当线程池无法接受新任务时,丢弃最早加入工作队列但尚未被执行的任务,然后尝试将新任务添加到队列中。

如何创建线程池?

1、手动创建 ThreadPoolExecutor 对象

  • 可以通过直接创建 ThreadPoolExecutor 对象来自定义线程池的各种参数,如核心线程数、最大线程数、工作队列类型等。
  • 通过构造函数 new ThreadPoolExecutor() 可以自定义线程池的各项参数,实现灵活的线程池管理。

2、Executors 工厂方法

  • Executors 类提供了一系列静态工厂方法快速创建常见类型的线程池,如 newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor 等。
  • 这些工厂方法可以方便地创建不同类型的线程池,简化了线程池的创建过程,但有时可能会因为一些默认参数而不适用于特定场景。

3、ScheduledExecutorService 创建定时任务线程池

  • ScheduledExecutorService 是一个支持定时任务和周期性任务执行的线程池。通过 Executors.newScheduledThreadPool() 方法创建。
  • 可以执行定时任务和周期性任务,具有方便的定时执行功能。

4、ForkJoinPool 创建并行任务线程池

  • ForkJoinPool 是 Java 7 中引入的用于支持并行任务执行的线程池,适用于拆分任务并行执行的场景。
  • 通过 new ForkJoinPool() 构造方法创建,并通过 ForkJoinTask 提交任务。

线程池的执行流程?

为什么阿里的Java开发规范中禁止使用Executors创建线程池?

1、FixedThreadPool和SingleThreadPool

        这两种线程池都使用无界的 LinkedBlockingQueue 作为任务队列,当请求队列长度无限制时(Integer.MAX_VALUE),如果请求产生过快,可能会导致请求堆积,消耗大量内存资源,最终导致内存溢出。

2、CachedThreadPool和ScheduledThreadPool

        这两种线程池使用的是 SynchronousQueue,且线程数量上限为 Integer.MAX_VALUE。如果系统中的任务量过大,可能会导致大量线程被创建,这会消耗大量系统资源,包括内存和 CPU 资源,最终也可能导致内存溢出。

3、线程池的拒绝策略可能不当

Executors创建的线程池默认的拒绝策略是抛出RejectedExecutionException异常,这可能会导致任务提交者无法得到合理的反馈,而采用更合理的拒绝策略需要自定义ThreadPoolExecutor。

ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》 

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

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

相关文章

如何使用公网地址远程访问内网Nacos UI界面查看注册服务

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心,它主要提供三种功能:持久化…

6、wuzhicms代码审计

wuzhicms代码审计 前言 安装环境配置 服务器要求 Web服务器: apache/nginx/iis PHP环境要求:支持php5.2、php5.3、php5.4、php5.5、php5.6、php7.1 (推荐使用5.4或更高版本!) 数据库要求: Mysql5www/install文件夹即可进入安装页面 审计开始 首页文件index.php&#xff0c…

kubernetes+prometheus+grafana监控+alertmanager实现qq邮箱报警

prometheus基于kubernetes监控 prometheus对kubernetes的监控 对于Kubernetes而言,我们可以把当中所有的资源分为几类: 基础设施层(Node):集群节点,为整个集群和应用提供运行时资源容器基础设施&#xff…

C/C++内存管理及内存泄漏详解

目录 C/C内存分布 C语言中动态内存管理方式:malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…

180基于matlab的频率切片小波变换程序(FTWT)

基于matlab的频率切片小波变换程序(FTWT)。从一种新的角度出发,通过自由选择频率切片函数、引进新尺度参数,在频率域实现小波变换,该变换能够很好地刻画信号各成分之间的相对能量关系。此外,频率切片小波变…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展, 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型,开辟了自然语言模型生成式预训练的路线。沿着这条路线,随后又陆续发布了GPT-2和GPT-3模型。与此同时,谷歌也…

探讨苹果 Vision Pro 的 AI 数字人形象问题

Personas 的设计模糊性: 部分人认为这种模糊设计可能是出于安全考虑🛡️。安全角度:Personas 代表着你的 AI 数字形象,在创建时,它相当于你的 AVP(生物识别扫描器的存在增加了冒充的难度)。如果…

40、网络编程/TCP和UDP通信模型练习20240229

一、使用TCP模型创建服务器和客户端完成简单通信。 服务器代码&#xff1a; #include<myhead.h> #define SER_IP "192.168.32.130" #define SER_PORT 8888 int main(int argc, const char *argv[]) {//1.创建监听的套接字int sfd-1;sfdsocket(AF_INET,SOCK_S…

解决 MySQL 未运行但锁文件存在的问题

查看mysql状态时&#xff0c;显示错误信息"ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists"。 解决步骤 1、检查 MySQL 进程是否正在运行 在继续之前&#xff0c;我们首先需要确定 MySQL 进程是否正在运行。我们可以使用以下命令检查…

港中文联合MIT提出超长上下文LongLoRA大模型微调算法

论文名称&#xff1a; LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models 文章链接&#xff1a;https://arxiv.org/abs/2309.12307 代码仓库&#xff1a; https://github.com/dvlab-research/LongLoRA 现阶段&#xff0c;上下文窗口长度基本上成为了评估…

算法修炼-动态规划之路径问题(1)

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;选定一个网格为终点&#xff0c;走到这个网格的所有走法就是这个网格的上面一个网格的所有走法加上这个网格左边一个网格的所有走法&#xff0c;然后做好初始化工作就行。 class Solution { public:int…

MATLAB环境下基于偏置场校正的改进模糊c-均值聚类图像分割算法

基于聚类的分割方法是以统计学为基础提出的一种分割方法。其实质是通过计算像素与每一类聚类中心的欧氏距离来判定像素与每一类聚类中心的相似性&#xff0c;距离近就说明像素与聚类中心相似性大&#xff0c;反之相似性小。基于一定标准下的相似性自动划分成若干个子集(类)&…

【无标题】TMGM官网平台切尔西足球俱乐部合作

TMGM作为一家在三大洲均设有办事处的行业领导者&#xff0c;TMGM 被视为可靠的差价合约交易提供商&#xff0c;其重点是监管合规、技术创新与他联系➕&#x1f6f0;️TMGM818卓越的客户服务。 切尔西足球俱乐部在亚太地区拥有庞大的球迷群体&#xff0c;并在该地区建立了多种亚…

2024年腾讯云优惠政策_腾讯云TOP10优惠活动

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

AOP案例(黑马学习笔记)

需求 需求&#xff1a;将案例中增、删、改相关接口的操作日志记录到数据库表中 ● 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时&#xff0c;需要详细的操作日志&#xff0c;并保存在数据表中&#xff0c;便于后期数据追踪。 操作日志信息包含&#xff1a; ●…

IO多路转接

1.select 初识select 系统提供 select 函数来实现多路复用输入 / 输出模型 . select 系统调用是用来让我们的程序监视多个文件描述符的状态变化的 ; 程序会停在 select 这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态改变 ; select函数模型 select的函…

服务器硬件得基础知识介绍

服务器硬件是计算机硬件的一种&#xff0c;专门用于构建服务器系统。服务器硬件通常具有高性能、高可靠性和可扩展性等特点&#xff0c;以满足企业级应用的需求。本文将从以下几个方面介绍服务器硬件的基础知识&#xff1a;服务器概述、CPU、内存、存储、网络、电源和散热、服务…

【机器学习】CIFAR-10数据集简介、下载方法(自动)

【机器学习】CIFAR-10数据集简介、下载方法(自动) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支…

0904多元复合函数求导-多元函数微分法及其应用

文章目录 1 复习一元函数复合函数求导2 一元函数与多元函数复合的情形3 多元函数与多元函数复合的情形4 其他情形5 抽象复合函数求导6 全微分不变性结语 1 复习一元函数复合函数求导 y f ( u ) , u ϕ ( x ) ⇒ f [ ϕ ( x ) ] d y d x d y d u ⋅ d u d x f ′ ( u ) ⋅ ϕ…

Python正则表达式:从基础到高级应用的全面总结与实战【第103篇—JSON模块】

Python正则表达式&#xff1a;从基础到高级应用的全面总结与实战 正则表达式是一种强大的文本匹配和处理工具&#xff0c;广泛应用于文本处理、数据抽取、表单验证等领域。本文将从正则表达式的基础知识出发&#xff0c;逐步深入&#xff0c;最终结合代码实战&#xff0c;带你…