当前位置: 首页 > news >正文

Java中的四种线程池详解及使用场景

前言

在Java并发编程中,JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法,这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。

1. CachedThreadPool(可缓存线程池)

ExecutorService cachedPool = Executors.newCachedThreadPool();

特点与原理:

  • newCachedThreadPool创建的线程池会根据需要创建新的线程,并且可以灵活地回收空闲线程。
  • 线程池的核心线程数为0,最大线程数为Integer.MAX_VALUE,即理论上没有限制。
  • 使用SynchronousQueue作为任务队列,这是一个无界但不存储元素的队列,每个插入操作必须等待另一个线程的移除操作,因此当提交新任务时,若没有空闲线程可用,则会创建新的线程执行任务。
  • 当线程空闲超过60秒后会被终止并从线程池中移除,从而达到动态调整线程数量的目的。

适用场景:

  • 执行大量短生命周期的任务,且任务的执行时间远小于线程创建销毁的时间开销。
  • 对于并发执行的数量需求不确定,适合处理突发性的高并发请求。

2. FixedThreadPool(定长线程池)

ExecutorService fixedPool = Executors.newFixedThreadPool(nThreads);

特点与原理:

  • newFixedThreadPool创建的是一个固定大小的线程池,核心线程数和最大线程数相等。
  • 设置了明确的线程数量,一旦创建就不会再增加或减少。
  • 配合有界任务队列(通常默认是LinkedBlockingQueue),当线程数量达到上限时,新提交的任务将会被放入队列中等待执行。
  • 如果线程池中的所有线程都处于活动状态,新提交的任务将在队列中等待,直到有线程空闲出来。

适用场景:

  • 资源有限或者系统对资源消耗有严格要求的情况下,例如数据库连接池大小固定。
  • 需要控制并发数,防止过多的线程导致系统负载过重。

3. ScheduledThreadPool(定时/周期性线程池)

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(corePoolSize);

特点与原理:

  • newScheduledThreadPool创建的线程池主要用于执行定时任务和具有固定延迟的任务。
  • 核心线程数可自定义,非核心线程闲置时会被回收,但不会低于核心线程数。
  • 支持延迟或定期执行Runnable或Callable任务,提供了schedule()scheduleAtFixedRate()等方法来安排任务执行。

适用场景:

  • 定时任务调度,如每隔一定时间执行一次清理、统计或者其他后台服务的操作。
  • 周期性任务执行,如心跳检测、数据同步等。

4. SingleThreadExecutor(单线程线程池)

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

特点与原理:

  • newSingleThreadExecutor创建的线程池只有一个工作线程。
  • 提交到此线程池的任务将按照FIFO(先进先出)顺序执行,确保所有任务在一个线程上按序完成。
  • 即使有多个任务提交,也不会同时执行,而是排队等待当前任务完成后才开始下一个任务。

适用场景:

  • 应用场景是对任务执行顺序有严格要求的环境,保证任务间串行执行。
  • 用于维护应用中某个组件的单一访问点,比如日志文件写入、GUI事件队列处理等。

总结来说,Java提供的这四种线程池各自服务于特定的并发场景,合理选择和使用线程池能有效提升系统的性能和稳定性,避免因频繁创建和销毁线程带来的额外开销,同时也方便进行统一管理和监控。在实际开发过程中,应遵循“线程池复用”的原则,避免重复创建线程池,尤其是对于Web项目而言,建立全局的线程池是非常重要的实践。

相关文章:

Java中的四种线程池详解及使用场景

前言 在Java并发编程中,JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法,这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…...

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…...

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码,例如:升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd,keil解析为0xc9数的GB2312编码为 0xcafd,keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …...

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人

如今,大模型层出不穷,这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是,普通人使用大模型还是有一…...

Android中 Gradle与 AGP 版本对应关系表

Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2.32.14.12.3.03.33.0.04.13.1.04.43.2.0 - 3.2.14.63.3.0 - 3.3.34.10.13.4.0 - 3.4.35.1.13.5.0 - 3.5.45.4.13.…...

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识,同学们也可以通过公众号菜单栏查看! 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…...

跟着pink老师前端入门教程-day13

品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称:品优购 项目描述:品优购是一个电商网站,我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合,里面需要大量的布…...

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…...

Vue.js 中子组件向父组件传值的方法

Vue.js 是一款流行的 JavaScript 前端框架,它提供了一套完整的工具和 API,使得开发者可以更加高效地构建交互式的 Web 应用程序。其中,组件化是 Vue.js 的一个核心概念,通过组件化可以将一个复杂的应用程序拆分成多个独立的部分&a…...

数据可视化 pycharts实现地理数据可视化(全球地图)

自用版 紧急整理一点可能要用的可视化代码,略粗糙 以后有机会再改 requirements: python3.6及以上pycharts1.9 数据格式为: 运行结果为: import pandas as pd from pyecharts.charts import Map, Timeline from pyecharts im…...

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一:Mac怎么查看环境变量命令 printenv一:这个命令会一次性列出所有环境变量的键值对,输出格式为: VAR1value1 VAR2value2 ...二: 也可以通过给这个命令加上环境变量名参数&#xff0…...

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆 快速全量克隆 特点:虚拟机启动快、拍平后数据独立 场景:快速发放独立的虚拟机,减少等待虚拟机部署完成时间,能够快速提供用户使用虚拟机。 实现方式:通过对…...

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具,可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而,有些网站会检测浏览器是否由Selenium驱动,如果是,就会返回错误的结果或拒绝访问。为了避免这种情况,我们需要…...

springboot149智慧图书管理系统设计与实现

智慧图书管理系统的设计与实现 摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现…...

3D词云图

工具库 tagcanvas.min.js vue3&#xff08;框架其实无所谓&#xff0c;都可以&#xff09; 实现 <script setup> import { onMounted, ref } from vue; import ./tagcanvas.min.js;const updateFlag ref(false);// 词云图初始化 const initWordCloud () > {let …...

opencv-python 视频读取: VideoCapture.get()参数详解

视频读取demo import cv2 from tqdm import tqdmvideoCapture cv2.VideoCapture(video_path) if not videoCapture.isOpened(): # 若视频文件读取失败&#xff0c;读取下一段视频print(视频打开失败!!!)print(video_path)return False total_frames int(videoCapture.get(c…...

python封装的.exe文件是如何在cmd中获取.xml路径的?

这段日子搞项目算法封装&#xff0c;愁死我。来回改了三遍&#xff0c;总算把相对路径、绝对路径&#xff0c;还有cmd给.exe传参的方式搞懂了。 主要是这个语句 workspace sys.argv[1] sys.argv[]的作用就是,在运行python文件的时候从外部输入参数往文件里面传递参数。 外部就…...

【学网攻】 第(18)节 -- 网络地址转换动态NAT

系列文章目录 目录 系列文章目录 文章目录 前言 一、NAT是什么&#xff1f; 二、实验 1.引入 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】…...

nosql数据库期末考试知识点总结

目录 1、什么是nosql数据库&#xff0c;它包括哪些 文档数据库 建数据 哪一种是最简单的 2、什么是文档数据库 3、创建mongodb时默认会建造三个数据库&#xff0c;是哪三个 4、mongodb支持的数据类型有哪些 5、它的常规语句有哪些 6、副本集和分片集有什么作用 复制 …...

字节大佬含泪吐血总结系列之 《计算机网络》(谢希仁)

字节大佬含泪吐血总结系列之 《计算机网络》&#xff08;谢希仁&#xff09; 原文地址&#xff1a;https://github.com/Snailclimb/JavaGuide 文章目录 字节大佬含泪吐血总结系列之 《计算机网络》&#xff08;谢希仁&#xff09;1. 计算机网络概述1.1. 基本术语1.2. 重要知识…...

MAX17332 Arduino库详解:单节锂电池燃料计量与独立充电控制

1. 项目概述 MAX17332 是 Maxim Integrated&#xff08;现为 Analog Devices&#xff09;推出的一款高度集成的单节锂离子/锂聚合物电池管理芯片&#xff0c;专为紧凑型便携设备设计。它并非传统意义上的“纯BMS”&#xff08;Battery Management System&#xff09;&#xff0…...

Vue3 的 JSX 函数组件,每次更新都会重新运行吗?

我用最直白、最无歧义、100%准确的方式&#xff0c;只回答你这一个问题&#xff1a; ✅ 最终答案&#xff08;背它&#xff09; 在 Vue3 中&#xff1a; 你写的 JSX 函数组件&#xff0c;整个函数 只会在组件初始化时运行 1 次&#xff01; 更新时&#xff0c;整个函数 不会重新…...

好用还专业!盘点2026年备受推崇的一键生成论文工具

一天写完毕业论文在2026年已不再是天方夜谭。最新实测显示&#xff0c;一键生成论文工具正在颠覆传统写作方式&#xff0c;覆盖选题、文献、写作、降重、排版等核心场景&#xff0c;真正实现高效搞定论文&#xff0c;学生党必备神器。 一、全流程王者&#xff1a;一站式搞定论文…...

树莓派C语言工程建立

从原来例子程序中拷贝一个例子例如blink目录到myPrj目录下&#xff0c;再拷贝其他几个文件&#xff0c;最终示意如下&#xff1a;修改CMakeLists.txt 文件&#xff0c;去除add_subdirectory(…)语句和add_subdirectory_exclude_platforms(…)语句&#xff0c;在最后增加 add_su…...

新手入门:用快马平台生成第一个labelimg式图像标注demo

今天想和大家分享一个特别适合计算机视觉新手的小项目——用InsCode(快马)平台快速搭建一个简易版的图像标注工具。这个工具类似labelimg的核心功能&#xff0c;但更轻量级&#xff0c;能帮助理解数据标注的基本流程。 项目背景理解 图像标注是计算机视觉的基础环节&#xff0c…...

从松到深:解析组合导航三大模式的演进路径与实战选型

1. 组合导航的底层逻辑与技术演进 第一次接触组合导航系统时&#xff0c;我被这个看似简单的概念惊艳到了——把两种完全不同的定位技术融合在一起&#xff0c;竟然能产生11>2的效果。这就像做菜时的黄金搭档&#xff0c;比如西红柿和鸡蛋单独吃都不错&#xff0c;但炒在一起…...

KKManager全流程管理指南:从安装到效率提升

KKManager全流程管理指南&#xff1a;从安装到效率提升 【免费下载链接】KKManager Mod, plugin and card manager for games by Illusion that use BepInEx 项目地址: https://gitcode.com/gh_mirrors/kk/KKManager 学习目标 理解KKManager的核心价值与应用场景掌握从…...

开发者社区生存手册:从潜水到活跃贡献者的5个关键步骤

开发者社区生存手册&#xff1a;从潜水到活跃贡献者的5个关键步骤 在数字时代的代码丛林里&#xff0c;开发者社区如同一个个闪烁着智慧火光的营地。你可能已经加入了几十个Slack频道&#xff0c;关注了无数技术大牛的Twitter&#xff0c;在GitHub上star了上百个仓库&#xff0…...

2024 0xGame Web安全挑战:从SQLite注入到RCE实战解析

1. SQLite注入基础与实战技巧 SQLite作为轻量级数据库&#xff0c;在CTF题目中经常出现。与MySQL注入相比&#xff0c;SQLite少了information_schema等常用表&#xff0c;但核心注入逻辑相通。以2024 0xGame的ez_sql题为例&#xff0c;我们来看具体操作&#xff1a; 闭合方式差…...

给CUDA新手的3DGS代码导读:从forward.cu到backward.cu,一步步拆解渲染流程

给CUDA新手的3DGS代码导读&#xff1a;从forward.cu到backward.cu&#xff0c;一步步拆解渲染流程 第一次看到3D Gaussian Splatting&#xff08;3DGS&#xff09;的CUDA代码时&#xff0c;我盯着那些复杂的核函数和内存操作发了半小时呆。作为从PyTorch转型过来的研究者&#…...