Java线程池种类及具体应用场景
Java线程池种类及具体应用场景
在实际开发中,选择合适的线程池类型至关重要,不同场景有不同的线程池需求。本文将结合线程池种类和具体应用示例,详细说明每种线程池的使用场景和适用情况。
一、固定大小线程池(FixedThreadPool
)
特点
- 线程数量固定:线程池中的线程数固定,超过的任务会被放入队列等待执行。
- 任务队列无界:会保存所有等待执行的任务。
适用场景
适用于任务量确定且需要长期运行的场景,例如:
- 处理固定数量的并发任务。
- 需要对线程数量严格控制,避免资源耗尽。
应用示例:文件批量处理
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPoolExample {public static void main(String[] args) {ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 模拟批量处理文件for (int i = 1; i <= 10; i++) {int fileNumber = i;fixedThreadPool.execute(() -> {System.out.println(Thread.currentThread().getName() + " 正在处理文件 " + fileNumber);try {Thread.sleep(1000); // 模拟文件处理耗时} catch (InterruptedException e) {e.printStackTrace();}});}fixedThreadPool.shutdown();}
}
输出示例:
pool-1-thread-1 正在处理文件 1
pool-1-thread-2 正在处理文件 2
pool-1-thread-3 正在处理文件 3
二、单线程池(SingleThreadExecutor
)
特点
- 单线程:始终只有一个线程执行任务,任务按提交顺序依次执行。
- 任务队列无界:任务不会丢失。
适用场景
适用于需要按顺序执行任务的场景,例如:
- 日志写入。
- 数据库备份任务。
应用示例:按顺序写入日志
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SingleThreadExecutorExample {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 模拟日志写入for (int i = 1; i <= 5; i++) {int logNumber = i;singleThreadExecutor.execute(() -> {System.out.println("写入日志:" + logNumber);});}singleThreadExecutor.shutdown();}
}
输出示例:
写入日志:1
写入日志:2
写入日志:3
三、可缓存线程池(CachedThreadPool
)
特点
- 线程数动态增长:没有核心线程,所有任务都创建新线程处理;线程空闲超时后会被销毁。
- 任务队列无界:适合短期大量任务。
适用场景
适用于执行大量短生命周期的任务,例如:
- 服务器处理大量临时任务。
- 并发测试。
应用示例:并发请求处理
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CachedThreadPoolExample {public static void main(String[] args) {ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 模拟并发请求for (int i = 1; i <= 10; i++) {int requestNumber = i;cachedThreadPool.execute(() -> {System.out.println(Thread.currentThread().getName() + " 正在处理请求 " + requestNumber);});}cachedThreadPool.shutdown();}
}
输出示例:
pool-1-thread-1 正在处理请求 1
pool-1-thread-2 正在处理请求 2
pool-1-thread-3 正在处理请求 3
四、定时任务线程池(ScheduledThreadPool
)
特点
- 支持定时和周期性任务:可以延迟执行任务,也可以周期性执行任务。
- 线程数固定:线程池大小由开发者设置。
适用场景
适用于需要定时或周期性执行任务的场景,例如:
- 定时任务提醒。
- 周期性数据同步。
应用示例:定时任务调度
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample {public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);// 延迟3秒执行任务scheduledThreadPool.schedule(() -> {System.out.println("任务延迟3秒后执行");}, 3, TimeUnit.SECONDS);// 每2秒执行一次任务scheduledThreadPool.scheduleAtFixedRate(() -> {System.out.println("周期任务,每2秒执行一次");}, 1, 2, TimeUnit.SECONDS);// 每3秒执行一次任务scheduledThreadPool.scheduleWithFixedDelay(() -> {System.out.println("固定延迟任务,每3秒延迟执行");}, 1, 3, TimeUnit.SECONDS);}
}
五、自定义线程池
特点
- 根据业务需求灵活配置参数。
- 通过自定义拒绝策略、任务队列、线程工厂等满足特定需求。
适用场景
适用于对线程池有特殊要求的场景,例如:
- 限制任务队列大小。
- 自定义日志记录线程工厂。
应用示例:控制线程数量并记录日志
import java.util.concurrent.*;public class CustomThreadPoolExample {public static void main(String[] args) {ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(2, // 核心线程数4, // 最大线程数60, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new ArrayBlockingQueue<>(2), // 有界队列r -> { // 自定义线程工厂Thread thread = new Thread(r);thread.setName("自定义线程-" + thread.getId());return thread;},new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略);for (int i = 1; i <= 10; i++) {int taskNumber = i;customThreadPool.execute(() -> {System.out.println(Thread.currentThread().getName() + " 正在执行任务 " + taskNumber);try {Thread.sleep(1000); // 模拟任务耗时} catch (InterruptedException e) {e.printStackTrace();}});}customThreadPool.shutdown();}
}
总结
线程池类型 | 特点 | 应用场景 | 示例应用 |
---|---|---|---|
FixedThreadPool | 固定大小线程池,无界任务队列 | 并发量稳定的长期任务,任务耗时较长 | 文件处理 |
SingleThreadExecutor | 单线程,按顺序执行任务 | 需要任务顺序执行的场景 | 日志记录 |
CachedThreadPool | 动态线程数,可快速处理大量短任务 | 短生命周期的并发任务 | 并发请求处理 |
ScheduledThreadPool | 支持定时和周期性任务 | 定时任务、周期性任务调度 | 任务提醒,数据同步 |
自定义线程池 | 参数灵活,满足特殊需求 | 高级任务管理 | 限制队列大小,拒绝策略 |
根据实际场景选择合适的线程池,既能优化系统性能,又能合理分配资源。
相关文章:
Java线程池种类及具体应用场景
Java线程池种类及具体应用场景 在实际开发中,选择合适的线程池类型至关重要,不同场景有不同的线程池需求。本文将结合线程池种类和具体应用示例,详细说明每种线程池的使用场景和适用情况。 一、固定大小线程池(FixedThreadPool&a…...
3D建筑模型的 LOD 规范
LOD(细节层次) 是3D城市建模中用于表示建筑模型精细程度的标准化描述不同的LOD适用于不同的应用场景 LOD是3D建模中重要的分级标准,不同层级适合不同精度和用途的需求。 从LOD0到LOD4,细节逐渐丰富,复杂性和精度也逐…...
掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)
前面化解了Micro_ROS通讯问题,并在 RT-Thread Studio 环境下,使用Micro_ROS软件包中的例程,实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c ,实现了接收 turtle_teleop_key 所发出的 turtle…...
同步时序电路——描述
这部分要求了解一些触发器的状态方程: R-S触发器: D触发器: JK触发器: 时序电路:任一时刻的输出既与即刻输入有关(若有输入),还与电路当时的状态有关(和以前的输入有关),即电路具有记忆能力。 时…...
.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角
窗体透明, 将Form的属性Opacity,由默认的100% 调整到 80%,这个数字越小越透明(尽量别低于50%,不信你试试看)! 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...
反爬虫机制
许多网站会采取措施来防止爬虫频繁访问或抓取大量内容,这些措施被称为反爬虫机制。常见的反爬手段包括: IP 限制:通过检测频繁访问的 IP 地址,限制该 IP 的访问。 请求频率限制:网站可能通过检测请求间隔过短来判断是…...
ML 系列:第 31 节— 机器学习中的协方差和相关性
文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 (有关详细信息)3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…...
registry 删除私有仓库镜像
原文链接:https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除,只需进行register 磁盘删除镜像 彻底删除了,就可以到达彻底删除的目的。 如果只需要软删除,则只需进行通过API删除。 curl --header "Ac…...
初识java(3)
大家好,今天我们来讲讲我们的老伙计-变量,在哪一门编程语言中,变量的作用都是不可或缺的,那么下面我们就来详细了解一下java中的变量。 一.变量概念 在程序中,除了有始终不变的常量外,有些内容可能会经常…...
前端JavaScript(一)---基本介绍
Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对…...
【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)
🗺️博客地图 📍1、报错发现 📍2、原因分析 📍3、解决办法 📍4、测试结果 1、报错发现 装好了CentOS操作系统,使用ssh远程登陆CentOS,出现如下告警信息: bash: 警告:setlocale…...
P1198 [JSOI2008] 最大数
P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士:单调队列 思路: 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的(真无语了) 我们可以在每次插入时整一个叫…...
嵌入式串口通信 基于芯片STC8H8K64U 串口通信入门001
引言 差不多有四年的时间没有写csdn的原创文章了。一方面是由于家庭的角色转换,已为人母,家中的很多琐事牵绊了我。另一方面是因为工作确实也非常的忙碌。工作需要,也会不断地学习新的知识和复习旧的知识,思来想去,还是决心把工作中的经验心得和遇到的问题,和各位程序猿朋…...
基于Java的小程序电商商城开源设计源码
近年来电商模式的发展越来越成熟,基于 Java 开发的小程序电商商城开源源码,为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行,可以实现管理员;首页、个人中心、用户…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 硬件: 设备容量备注硬盘>500G多版本系统测试,必须固态,否则编译卡死硬盘>300G单系统…...
计算机网络八股整理(二)
计算机网络八股整理(二) 应用层 1:dns的全称了解过吗? dns全称domain-name-system,翻译过来就是域名系统,是在计算机网络中将域名转换成ip地址的分布式数据库系统; 域名服务器的层级类似一个树…...
华财术_号卡分销平台讲解(四大运营商+手机卡)
【号卡分销平台对比讲解稿】 大家好,今天我们来详细对比几款热门的号卡分销平台,帮助您找到最适合自己的合作伙伴。我们将从佣金结算、数据安全、功能特性、用户体验以及适用人群等多个维度进行剖析,让您一目了然各平台的优劣。 一、号易号…...
fatal error in include chain (rtthread.h):rtconfig.h file not found
项目搜索这个文件 rtconfig 找到后将其复制粘贴到 你的目录\Keil\ARM\ARMCC\include 应该还有cJSON,rtthread.h和 等也复制粘贴下...
服务器记录所有用户docker操作,监控删除容器/镜像的人
文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户,所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器,使用的docker …...
电磁继电器
它的控制原理很简单,当我们给它的线圈接电,这个线圈就有了磁性,它上面的衔铁就会被吸引,这样小灯泡就会点亮 继电器于MOS管的差别在于,继电器可以很轻松的胜任高电压、大电流的场合 我们从外壳上可以看到 30VDC&#x…...
Hadoop生态圈框架部署(九)- Hive部署
文章目录 前言一、Hive部署(手动部署)下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…...
thread_id_key != 0x7777(`fibers` 包与 Node.js 16 及以上版本存在兼容性问题)
文章目录 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性1. Node.js 版本兼容性2. 特定包版本 (fibers4.0.3)3. 解决方案和替代方案 结论解决方案 运行yarn serve 启动项目,就会弹出上述错误。 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性 要判断 fibers4.0.3…...
LabVIEW实现UDP通信
目录 1、UDP通信原理 2、硬件环境部署 3、云端环境部署 4、UDP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合…...
hive的存储格式
1) 四种存储格式 hive的存储格式分为两大类:一类纯文本文件,一类是二进制文件存储。 Hive支持的存储数据的格式主要有:TEXTFILE、SEQUENCEFILE、ORC、PARQUET 第一类:纯文本文件存储 textfile: 纯文本文件存储格式…...
设置Mysql5.6允许外网访问
设置mysql用户支持外网访问步骤: 需要使用root权限登录mysql,更新mysql.user表,设置指定用户的Host字段为%,默认一般为127.0.0.1或者localhost。 1.登录数据库 1 mysql -u root -p 输入密码 1 mysql> use mysql; 2.查询hos…...
【智能制造-44】装配仿真
装配仿真包含以下功能模块: 零件建模与导入模块 功能描述: 能够创建简单的几何零件,如立方体、圆柱体、球体等基本形状。这对于一些标准件或者形状规则的零件来说,可以直接在装配仿真软件中生成,方便快捷。 支持多种…...
如何借助AI生成PPT,让创作轻松又高效
PPT是现代职场中不可或缺的表达工具,但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作,常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化,还重新定义了效率与创意的关系…...
【工具变量】城市供应链创新试点数据(2007-2023年)
一、测算方式:参考C刊《经济管理》沈坤荣和乔刚老师(2024)的做法,使用“供应链创新与应用试点”的政策虚拟变量(TreatPost)表征。若样本城市为试点城市,则赋值为 1,否则为 0…...
线程的生命周期
计时等待(Timed Waiting)状态:这是等待状态的一种特殊情况,当线程调用带有超时参数的等待方法(如Thread.sleep(long millis)、Object.wait(long timeout)等)时会进入计时等待状态。例如,Thread.…...
Python入门(18)--实战项目
机器学习实战项目指南 🤖 项目概览 🌐 本项目是一个综合性的机器学习入门实战指南,通过实际案例展示机器学习项目的完整生命周期,包括数据处理、模型训练、评估和部署等关键环节。 1. 系统架构 🏗️ 1.1 核心组件 …...
DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放
提示:视频转hls流加密、web解密播放 需求:研究视频截屏时,播放器变黑,所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 HLS流媒体协议&a…...
在linux上部署Tomcat方法
上传jdk,配置运行环境 解压jdk安装包 将jdk文件夹移动到/usr/local/jdk目录下 配置java环境变量vim /etc/profile 使环境变量生效,并且查看是否配置成功 安装tomcat,上传tomcat软件包 解压tomcat软件包 将tomcat解压文件移动到/usr/local/tomcat/下 启动…...
Git 使用问题与解决方案
Git 使用问题与解决方案 目录 常见错误及原因分析检查当前使用 HTTPS 或 SSH如何切换远程仓库到 SSHSSH 密钥的配置与验证错误解决步骤总结与参考 1. 常见错误及原因分析 错误提示 fatal: unable to access https://github.com/username/repository.git/: Failed to connect…...
LeetCode 热题 100_最大子数组和(13_53)(贪心算法 ||动态规划)
LeetCode 热题 100_最大子数组和(13_53) 题目描述:输入输出样例:题解:解题思路:代码实现(思路二(贪心算法 ||动态规划)): 题目描述: …...
Z2400023基于Java+Servlet+jsp+mysql的酒店管理系统的设计与实现 源码 调试 文档
酒店管理系统的设计与实现 1.摘要2.主要功能3. 项目技术栈运行环境 4.系统界面截图5.源码获取 1.摘要 本文介绍了一个基于Java的酒店管理系统,该系统采用Servlet、JSP、JDBC以及c3p0等技术构建,为酒店提供了一个全面的管理平台。该系统不仅适合酒店进行…...
T3 TensorFlow入门实战——天气识别
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import numpy as np import os,PIL,pathlib import matplotlib.pyplot as …...
vue3 多种方式接受props,定义ref,reactive
定义props 1 第一种 interface AddType { dialogStudyVisible: boolean; } const props defineProps<AddType>(); 第二种 // const props defineProps({ // dialogStudyVisible:{ // type:Boolean, // default:false // } // }) 第三种 // const …...
15:00面试,15:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到9月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
vue3 数字滚动插件vue3-count-to
安装 npm i vue3-count-to -S 引入 import { CountTo } from vue3-count-to 使用 <countTo :startVal"0" :endVal"57.63" :decimals"0" :duration"3000"></countTo> 所有配置...
Android 手写签名板
文章目录 Android 手写签名板概述效果代码实现源码下载 Android 手写签名板 概述 手写签名板功能,支持图片保存、支持去除空白区域。 效果 生成图片效果: 代码实现 定义属性: <declare-styleable name"SignatureView">&…...
Java基础夯实——2.9 多线程如何共享数据
在 Java 多线程编程中,共享数据通过以下几种方式实现: 1. 使用共享对象 多个线程可以通过引用同一个对象来实现数据共享。例如: class SharedData {private int count;public synchronized void increment() {count;}public synchronized …...
京准电钟:NTP网络校时服务器从入门到精准
京准电钟:NTP网络校时服务器从入门到精准 京准电钟:NTP网络校时服务器从入门到精准 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的“整点开拍”、“秒杀”、“Leader选举”,通信行业的“同步…...
【C++习题】15.滑动窗口_串联所有单词的子串
文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 30. 串联所有单词的子串 题目描述: 解法 滑动窗口哈希表 这题和第14题不同的是: 哈希表不同:hash<string,int>left与right指…...
【好玩的经典游戏】Docker环境下部署贪吃蛇网页小游戏(二)
【好玩的经典游戏】Docker环境下部署贪吃蛇网页小游戏(二) 一、贪吃蛇小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.3 检查Docker版本3.4 检查docker compose 版本四、下载容器镜像五、部…...
《Python Web 抓取实战:豆瓣电影 Top 250 数据抓取与分析》
引言 在信息爆炸的时代,掌握数据获取的能力显得尤为重要。通过数据抓取,我们可以从互联网上获取大量有价值的信息,并进行深入分析。本文将介绍如何使用 Python 进行 Web 抓取,以豆瓣电影 Top 250 为例,展示数据抓取的…...
Qt-系统相关(2)多线程网络
Qt多线程 在 Qt 中,多线程的处理⼀般是通过 QThread类 来实现。 QThread 代表⼀个在应⽤程序中可以独⽴控制的线程,也可以和进程中的其他线程共享数据。 QThread 对象管理程序中的⼀个控制线程。 QThread 常⽤ API: 使用线程 关于创建线程…...
代码随想录算法训练营第五十九天|Day59 图论
Bellman_ford 算法精讲 https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I.html 思路 #include <stdio.h> #include <stdlib.h> #include <limits.h>#define MAXM 10000 // 假设最大边数为1…...
SpringBoot集成ESAPI
官网地址:https://github.com/ESAPI/esapi-java-legacy 一、POM依赖 <dependency><groupId>org.owasp.esapi</groupId><artifactId>esapi</artifactId><version>2.6.0.0</version> <!-- Preferably the latest ver…...
Git 进程占用报错-解决方案
背景 大仓库,由于开发者分支较多,我们在使用 git pull 或 git push 等命令时(与远端仓库交互的命令),不知之前配置了什么,我的电脑会必现以下报错(有非常长一大串报错-不同分支的git进程占用报…...
python怎么设置静态变量
众所周知,Python语言并不支持静态变量,比如下面这样一个应用场景: void foo() {static int count 0;count ; } 在Python中无法自然实现这个功能。换个角度来看这个问题,函数中的静态变量其实可以看做是函数的一个内部变量&#x…...