高薪程序员必修课-Spring中如果核心线程数为0,线程池会如何执行

目录

前言

线程池的原理

核心线程数为0的情况

示例代码

示例解释

运行示例

示例运行分析

总结


前言

        在Spring(以及底层的Java Executor 框架)中,如果线程池的核心线程数设置为0,线程池的行为将受到影响。了解这种情况下线程池的行为,可以帮助你合理配置线程池以满足应用程序的需求。

线程池的原理

线程池是用于管理和复用线程的工具,以避免线程的频繁创建和销毁带来的开销。Java中的 ThreadPoolExecutor 是线程池的核心实现,它通过以下几个参数来控制线程池的行为:

  • corePoolSize:核心线程数,即线程池中始终保持存活的线程数量。
  • maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。
  • keepAliveTime:非核心线程的存活时间,当空闲时间超过这个时间时,非核心线程会被终止。
  • workQueue:任务队列,用于存储等待执行的任务。

核心线程数为0的情况

当核心线程数设置为0时,线程池在没有任务执行时将不会保留任何线程。这种配置对线程池的行为有以下影响:

  1. 任务提交时创建线程:当有新任务提交到线程池时,如果没有可用线程,线程池会创建新线程来处理任务,直到达到 maximumPoolSize
  2. 任务完成后销毁线程:线程在完成任务后会进入空闲状态,并在超过 keepAliveTime 后被终止。因此,线程池在没有任务时将不会有任何线程存活。
  3. 依赖任务队列:如果任务队列已满,且当前线程数已达到 maximumPoolSize,新任务将被拒绝(通常通过抛出 RejectedExecutionException)。

示例代码

以下是一个Spring配置示例,演示了核心线程数为0的线程池配置及其行为:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
public class ThreadPoolConfig {@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(0); // 核心线程数为0executor.setMaxPoolSize(5);  // 最大线程数executor.setQueueCapacity(10); // 任务队列容量executor.setKeepAliveSeconds(60); // 非核心线程的存活时间executor.setThreadNamePrefix("MyExecutor-");executor.initialize();return executor;}
}

示例解释

  1. 核心线程数为0executor.setCorePoolSize(0); 设置核心线程数为0,意味着线程池在没有任务时不会保留任何线程。
  2. 最大线程数executor.setMaxPoolSize(5); 设置最大线程数为5,线程池最多可以同时执行5个任务。
  3. 任务队列容量executor.setQueueCapacity(10); 设置任务队列容量为10,队列用于存储等待执行的任务。
  4. 非核心线程的存活时间executor.setKeepAliveSeconds(60); 设置非核心线程的存活时间为60秒,超过这个时间的空闲线程将被终止。
  5. 线程名称前缀executor.setThreadNamePrefix("MyExecutor-"); 设置线程名称的前缀,方便调试和日志记录。

运行示例

下面是一个简单的示例,展示了如何提交任务到上述配置的线程池中:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;@Service
public class TaskService {@Autowiredprivate Executor taskExecutor;@PostConstructpublic void submitTasks() {for (int i = 0; i < 15; i++) {int taskId = i;taskExecutor.execute(() -> performTask(taskId));}}@Asyncpublic void performTask(int taskId) {System.out.println(Thread.currentThread().getName() + " is executing task " + taskId);try {Thread.sleep(2000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

示例运行分析

  1. 提交任务:在 TaskService 中,通过 taskExecutor.execute() 提交了15个任务。
  2. 线程创建:由于核心线程数为0,线程池会为每个新任务创建新线程,直到达到最大线程数5。
  3. 任务执行:前5个任务会立即执行,其余任务会被放入任务队列中等待执行。
  4. 线程销毁:任务完成后,线程将进入空闲状态,并在空闲超过60秒后被终止。

总结

        当线程池的核心线程数设置为0时,线程池在没有任务时不会保留任何线程,只有在有新任务提交时才会创建线程。这种配置可以节省资源,但需要合理设置任务队列容量和最大线程数,以避免任务被拒绝或线程频繁创建和销毁带来的性能开销。

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

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

相关文章

python库 - json

文章目录 主要功能常用函数1. json.dumps()2. json.loads()3. json.dump()4. json.load() 自定义序列化和反序列化自定义序列化自定义反序列化 json 是 Python 标准库中的一个模块&#xff0c;用于处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据格式。JSON …

17-Pandas缺失值处理

Python Pandas缺失值处理 在一些数据分析业务中&#xff0c;数据缺失是我们经常遇见的问题&#xff0c;缺失值会导致数据质量的下降&#xff0c;从而影响模型预测的准确性&#xff0c;这对于机器学习和数据挖掘影响尤为严重。因此妥善的处理缺失值能够使模型预测更为准确和有效…

20240627构造专题

写在前面&#xff1a;出场即巅峰&#xff08;明日模拟赛RP&#xff09; 一.何为构造 就是通过对一道题题面的分析可以发现某种规律&#xff08;类似于不完全归纳法&#xff09;&#xff0c;然后发掘本质&#xff0c;就可以很快的解题&#xff0c;但是显然我还没有掌握 二.一…

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记 跑通baseline 1、安装依赖 下载相应的数据库 !pip install --upgrade -q spark_ai_python2、配置导入 导入必要的包。 from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler from sparkai.core.messages…

JAVA基础教程DAY2-类的构造方法及类的实例化调用

下面我们来讲如何建好类以及如何将它实例化 首先建立一个学生类Student&#xff0c;里面要求有属性&#xff0c;学号、年龄为int型&#xff0c;姓名&#xff0c;方法有学习study 在Student.java文件当中&#xff0c;我们完成以上代码为 public class Student {int age17;in…

【JS】期末复习题

一、选择题 1&#xff0e;下面四种标签哪种写法不正确&#xff08; D &#xff09;。 A&#xff0e;<html></html> B&#xff0e;<Html></Html> C&#xff0e;<HTML></HTML> D&#xff0e;<html><h…

React基础与核心概念探索

目录 React简介 起源与设计理念 JSX语法 什么是JSX&#xff1f; 为什么使用JSX&#xff1f; JSX的转换过程 组件化架构 React组件的概念 分类&#xff1a;函数组件 vs 类组件 状态管理 Props传递 虚拟DOM 高效DOM更新的秘密 工作原理 React简介 起源与设计理念 React&…

操作系统大题复习

磁盘调度算法 一次磁盘读写需要的时间 寻道时间 先来先服务FCFS 优点&#xff1a;公平 缺点&#xff1a;性能差&#xff0c;寻道时间长 最短寻道时间有限SSTF 缺点&#xff1a;可能产生饥饿现象 扫描算法SCAN 优点&#xff1a;不会产生饥饿现象 缺点&#xff1a;响应频率…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

docker部署wg-easy和firefly

Background WireGuard是一种新型的VPN协议,它通过在内核层运行,提供高效、安全、简单和现代的VPN解决方案。wg-easy是一个专为简化 WireGuard VPN配置和管理而设计的工具&#xff0c;提供了界面化的管理&#xff0c;进一步降低WireGuard 的使用门槛&#xff0c;让用户无需深入了…

在Linux中对Nginx配置rewrite跳转

nginx安装在IP为x.x.x.x的服务器上 rewrite语法&#xff1a; rewrite <正则表达式> <指定替换的内容> <flag标记> 注释&#xff1a;使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标记位&#xff08;redirect返回302临时重定向…

css_23_多列布局

常用值&#xff1a; column-count&#xff1a;指定列数&#xff0c;值是数字。 column-width&#xff1a;指定列宽&#xff0c;值是长度。 columns &#xff1a;同时指定列宽和列数&#xff0c;复合属性&#xff1b;值没有数量和顺序要求。 column-gap&#xff1a;设置列边距…

Java时间转换

一、线程不安全 Date date new Date(); SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String prefix dateFormat.format(date);二、线程安全,建议使用 String t1 LocalDateTime.now().format(DateTimeFormatter.ofPattern("y…

【C++】STL-stack_queue

目录 1、stack和queue的使用 1.1 最小栈 1.2 栈的弹出和压入序列 1.3 二叉树的层序遍历 2、stack和queue的模拟实现 2.1 适配器 2.2 deque 2.2.1 deque的成员变量 2.2.2 deque的迭代器 2.2.3 deque尾插元素 2.2.4 deque头插元素 2.2.5 下标访问 2.2.6 deque的不足 …

Transformer模型学习

Transformer模型是深度学习领域的一种创新架构&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;任务中表现出色。它是由Vaswani等人在2017年的论文《Attention is All You Need》中首次提出的。以下是对Transformer模型的详细介绍&#xff1a; Transformer的起源和…

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库&#xff0c;这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念&#xff1a;用户属于部门&#xff0c;部门拥有 角色&#xff0c;则又多了一层&#xff1a; user-…

力扣刷题--3158. 求出出现两次数字的 XOR 值【简单】

题目描述 给你一个数组 nums &#xff0c;数组中的数字 要么 出现一次&#xff0c;要么 出现两次。 请你返回数组中所有出现两次数字的按位 XOR 值&#xff0c;如果没有数字出现过两次&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,1,3] 输出&…

数据加密解密和哈希的解析

[S1301]数据的加解密 对提供的原始数据&#xff08;字符串或者二进制数组&#xff09;进行加密是数据保护框架体提供的基本功能&#xff0c;接下来我们利用一个简单的控制台程序来演示一下加解密如何实现。数据的加解密均由IDataProtector对象来完成&#xff0c;而该对象由IDa…

Linux硬链接和软链接(符号链接)

ln 是 Linux 和 Unix 系统中用来创建链接的命令。它的基本用法如下&#xff1a; 创建硬链接&#xff1a; ln source_file target_link这会创建一个名为 target_link 的硬链接&#xff0c;指向 source_file。硬链接实际上是文件系统中的一个额外条目&#xff0c;指向相同的数据块…

Elasticsearch:Runtime fields - 运行时字段(一)

运行时字段&#xff08;runtime fields&#xff09;是在查询时计算的字段。运行时字段使你能够&#xff1a; 向现有文档添加字段而无需重新索引数据开始处理数据而无需了解其结构在查询时覆盖索引字段返回的值定义用于特定用途的字段而无需修改底层架构 你可以像访问其他任何…