高薪程序员必修课-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 {

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(0); // 核心线程数为0
        executor.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 {

    @Autowired
    private Executor taskExecutor;

    @PostConstruct
    public void submitTasks() {
        for (int i = 0; i < 15; i++) {
            int taskId = i;
            taskExecutor.execute(() -> performTask(taskId));
        }
    }

    @Async
    public 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.mfbz.cn/a/765735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java面试课程-SpringIOC部分源码解析

1.SpringIOC的refresh源码解析 核心&#xff1a; 核心使用的是&#xff1a; 需要完成配置类的解析&#xff0c;各种BeanFactoryProcessor的注册。还有写国际化配置的初始化。Web容器的内部构造。 上面几个方法是refresh方法的内容。注意可以与applicationContext里的内容一起…

Profibus DP主站转Modbus网关连接智能化电表通讯

Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff09;&#xff0c;是实现不同工业通信协议之间互联互通的设备&#xff0c;主要将Profibus DP协议转换为Modbus协议&#xff0c;实现数据的双向传输。通过Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff…

大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容?

环境: Excel2016 问题描述: 大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容? 解决方案: 遇到这种情况,说明Excel文件非常大,超出了你当前计算机配置的处理能力。以下是一些解决方法,帮助你尝试打开或…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

编译原理2

推导和短语 推导 推导过程中&#xff0c;每一步推导都是对句型的 最右非终结符 进行替换&#xff0c;最右推导(规范推导)&#xff1b; 短语 用 β 替换 A&#xff0c;则 β 就是 关于A 的一个短语&#xff1b; 直接短语是短语范围内的一步推导&#xff1b; 直接短语可能不…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

Sentinel实现区分来源

要区分来源就要写代码实现RequestOriginParser接口 &#xff0c;注意是要实现com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser 接口&#xff0c;别搞错接口了。 MyRequestOriginParser.java package com.codex.terry.sentinel.origin;import com.ali…

STM32mp157aaa按键中断实验

效果图&#xff1a; 源码&#xff1a; #include "key.h" void hal_key1_rcc_gpio_init() {// 使能GPIOF组RCC->MP_AHB4ENSETR | (0x1 << 5);// 设置引脚位输入模式GPIOF->MODER & (~(0X3 << 18));GPIOF->MODER & (~(0X3 << 16))…

当Matplotlib遇见SciencePlots

分享一个Matplotlib扩展工具SciencePlots&#xff0c;一行代码绘制science、nature、ieee等要求的图形。 安装 安装SciencePlots # 直接从PyPI安装 pip install SciencePlots 安装latex 如果latex未安装&#xff0c;会报错&#xff1a;RuntimeError: Failed to process st…

【QT开发】乒乓球碰撞反弹demo

在编写代码时&#xff0c;无意弄出来了一个这个东西&#xff0c;觉得挺有意思的记录一下&#xff0c;类似乒乓球在矩形内一直运动碰撞反弹demo 头文件 #ifndef MYPROJECT_H #define MYPROJECT_H#include <QMainWindow> #include <QPainter> #include "form.…

【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例

在医疗领域&#xff0c;疾病数据合法合规共享是亟待解决的难题。一方面&#xff0c;当一家医院对患者实施治疗后&#xff0c;若患者转到其 他医院就医&#xff0c;该医院就无法判断诊疗手段是否有效。另一方面&#xff0c;医疗数据属于个人敏感数据&#xff0c;一旦被泄露或被恶…

前端开发中的常见问题及解决方法

前端开发是一个充满挑战和乐趣的领域。然而&#xff0c;在开发过程中&#xff0c;开发者常常会遇到各种各样的问题。本文将介绍一些前端开发中常用或者经常遇到的问题&#xff0c;并提供相应的解决方法&#xff0c;帮助你提高开发效率和解决问题的能力。 一. 页面布局问题 问题…

ArcTs布局入门03——层叠布局(Stack)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01; 扫描下面的二维码关注公众号。 1、概述 叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实…

机械拆装-基于Unity-装配功能的实现

目录 1. 装配场景的相机控制 2. 鼠标拖拽和旋转功能的实现 2.1 鼠标拖拽 2.2 物体旋转 3. 零件与装配位置的对应关系 4. 轴向装配的准备位置 5. 装配顺序的实现 5.1 标签提示 5.2 定义一个变量记录步骤数值 1. 装配场景的相机控制 开始装配功能时&#xff0c;需要将相机调…

k8s公网集群安装(1.23.0)

网上搜到的公网搭建k8s都不太一致, 要么说的太复杂, 要么镜像无法下载, 所以写了一个简洁版,小白也能一次搭建成功 使用的都是centos7,k8s版本为1.23.0 使用二台机器搭建的, 三台也是一样的思路1.所有节点分别设置对应主机名 hostnamectl set-hostname master hostnamectl set…

QT4-QT5(6)-const char* QString 乱码转换

我简单粗暴的给出个结论&#xff1a; QString GBK编码正常&#xff0c;可以转UTF-8编码&#xff0c;但会有少量乱码。 const char* 编码就不要转编码&#xff0c;转哪个都是乱码。 UTF-8.cpp 下 1.QString GBK->UTF-8 2.const char * GBK->UTF-8 const char *…

ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)

书籍&#xff1a; 《第一行代码 Android》第三版 开发环境&#xff1a; Android Studio Jellyfish | 2023.3.1 问题&#xff1a; 3.2.4在Activity中使用Toast章节中使用到了kotlin-android-extensions插件,但是该插件已经淘汰,根据网上了解,目前使用了新的技术VewBinding替…

Shiro框架

入门概述 1 shiro是什么? Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程…

Spring之spring的单例bean是线程安全的吗

Spring单例bean是线程安全的吗&#xff1f; 不是线程安全的。 1、Bean的作用域 Service Scope("singleton") public class UserServiceImpl implements UserService{ } singleton &#xff08;默认&#xff09;&#xff1a;bean在每个Spring IOC容器中只有一个实例…

【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫

二叉树1&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树2&#xff1a;深入理解数据结构第三弹——二叉树&#xff08;3&#xff09;——二叉树的基本结构与操作-CSDN博客 二叉树3&#xff1a;深入理解数据结构第三弹——二叉树…