Java线程池基本概念

  • 全局和局部线程池
    • 全局线程池
      • 在Spring框架中,全局线程池如ThreadPoolTaskExecutor通常是作为Spring Bean存在的,它们的生命周期由Spring容器管理。当Spring容器关闭时,这些线程池也会被适当地清理和关闭。因此,开发者通常不需要手动关闭这些全局线程池
    • 局部线程池
      • 对于在方法内部或者某个局部作用域创建的线程池,它们是局部资源,不会被Spring容器管理。如果不关闭这些线程池,可能会导致线程泄漏,因为这些线程池会继续存在并占用系统资源,直到程序结束。因此,使用完局部线程池后,需要调用shutdown()或shutdownNow()方法来关闭线程池,释放资源。
    • 资源管理
      • 关闭线程池是为了合理管理资源,防止资源泄露和浪费。全局线程池由Spring容器管理,可以确保在应用关闭时得到妥善处理。而局部线程池如果没有正确关闭,可能会导致不必要的资源占用,甚至影响应用程序的稳定性。
    • 总结:全局线程池由于其与Spring容器的生命周期绑定,通常不需要手动关闭;而局部线程池需要在使用完毕后显式关闭,以避免资源泄露和其他潜在问题。
    • 多线程使用要设置超时时间不然会OOM
      • 默认:超时时间并不是一个固定的时间,而是取决于多种因素,包括Spring的配置、操作系统和Java虚拟机的配置等
      • 设置了最大活跃时间,会变成默认超时时间
      • 原因:线程资源未释放,如果线程执行的任务长时间无法完成,这些线程会持续占用系统资源,包括内存。当应用创建过多未完成任务的线程时,内存资源逐渐被消耗,最终可能导致内存不足,从而引发OO
  • 单个线程池和多个线程池
    • 案例区别
      • 某程序使用:
        • ThreadPoolExecutor ThreadPoolAll = new ThreadPoolExecutor(30,60);
      • 某程序使用:
        • ThreadPoolExecutor ThreadPoolA = new ThreadPoolExecutor(15,30);
        • ThreadPoolExecutor ThreadPoolB = new ThreadPoolExecutor(15,30);
    • 单个线程池的优势
      • 简单:只需要管理一个线程池,代码实现和维护相对简单。
      • 资源共享:所有任务都在同一个线程池中执行,可以更好地利用系统资源,避免资源碎片化即有效利用资源。
    • 多个线程池的优势
      • 线程池资源隔离:每个线程池都有其最大线程数限制,可以防止某个线程池占用过多资源,导致其他线程池资源不足。
      • 任务优先级:通过配置不同的线程池,可以根据任务优先级为不同类型的任务分配不同的资源。
      • 鲁棒性:如果某个线程池出现问题,不会影响到其他线程池的正常运行。
  • ThreadLocal
    • 存储原理
      • threadLocal内部维护了一个Map,用于存储线程ID到其对应变量副本的映射。当一个线程访问ThreadLocal时,它会通过线程ID在Map中找到对应的变量副本。这样,即使多个线程同时访问同一个ThreadLocal变量,它们也只会访问到自己线程的专属副本。
      • 线程ID是关键,主线程会有主线程的线程ID,子线程会有子线程的线程ID,根据ID找副本
    • 依赖部署内存
      • ThreadLocal并不直接依赖部署内存,因为它主要是在运行时为每个线程分配独立的变量副本。然而,ThreadLocal的实现需要消耗一定的内存资源,因为它需要为每个线程维护一个Map结构来存储变量副本。因此,在使用ThreadLocal时,需要关注它对系统内存的影响
    • 使用注意
      • 需要注意的是,ThreadLocal不会自动回收不再使用的线程变量副本。如果线程长时间运行且频繁使用ThreadLocal,可能导致内存泄漏。因此,在使用ThreadLocal时,要确保在线程结束时手动调用remove()方法,以释放内存资源。
      • 弱引用原因
      • k-v; k都有模块名称,来区分上游链路调用,通过模块名称+线程id,确保底层的ThreadLocalMap在不同工作区间工作
    • 操作
      • set
      • get
      • remove
    • 使用场景
      • 为每个线程分配一个独享的对象,如Connection
      • 保存全局变量,特别是在拦截器中获取用户信息的场景。这样可以让不同方法直接使用这些变量,避免参数传递的麻烦
      • 数据库连接池的应用
        • 好处
          • 1,在数据库连接池中使用ThreadLocal的主要原因是为了保证每个线程都有其独立的数据库连接,这样可以避免多个线程之间的连接干扰,提高系统的稳定性和性能。
          • 2,ThreadLocal可以为每个线程提供一个独立的数据库连接,确保多个线程操作数据库时不会出现资源竞争的问题。此外,当每个线程都拥有自己的数据库连接时,避免了频繁地从连接池中获取和归还连接的开销,因此可以提高性能
          • 3,ThreadLocal还可以确保在一个线程内,可能需要进行的多个数据库操作使用的是同一个连接,从而保证事务的一致性
            • 类似用户是一个主线程在应用配置的分布式事务中,主线程拥有线程id,这个线程id有两个数据库的connection链接副本,所以能保证事务的一致性
            • 多个用户,多个线程ID
        • 不使用ThreadLocal的影响
          • 每次需要数据库连接时,都必须从连接池中获取,而在操作完成后归还。这样的频繁操作会增加额外的开销
          • 如果多个线程共享同一个数据库连接,可能会出现数据混乱、连接状态被意外修改等问题。同时,要确保一个线程内的多个数据库操作使用同一个连接进行事务管理会变得复杂
        • 总结
          • 数据库连接池使用ThreadLocal的主要原因是为了保证每个线程都有一个独立的数据库连接,从而提高系统的稳定性和性能。ThreadLocal为每个线程提供了独立的资源副本,避免了资源竞争的问题,并且可以通过缓存连接来减少频繁获取和归还连接的开销。此外,ThreadLocal还有助于简化事务管理,确保多个数据库操作在同一事务内进行。如果不使用ThreadLocal,可能会导致资源竞争、数据混乱和事务一致性问题。

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

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

相关文章

DDD架构和微服务初步实现

本次记录的是微服务的初步认识和DDD架构的初步实现和思路,在之前的发布里,对Javaweb进行了一次小总结,还有一些东西,不去详细理解说明了,下面开始我对微服务的理解。 什么是微服务? 在刚刚开始学习的时候…

Study--Oracle-03-数据库常规操作

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、oracle 版本及主要功能 二、数据安装完成后常用操作SQL 1、检查数据库监听状态 监听的常用命令 启动:[oracleoracle u01]$ lsnrctl stop 停止&am…

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024) 会议简介 2024国际信息系统、信号处理与通信技术大会(ICISPCT2024)将在青岛隆重开幕。本次会议旨在汇聚全球信息系统、信号处理和通信技术领域的专家学者,共同探索行业…

【记录46】【案例】echarts 柱状图

echarts环境4.1.0 <template><div id"threefour"></div> </template> <script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {}},methods:{getdata(){var myChart…

《平衡小车控制系统》电子设计大赛校赛感悟

我们学校举行了一次电子设计大赛选拔赛&#xff0c;虽然我们在测试的时候全部都可以完成&#xff0c;最后考核的时候因为方案选择问题以及各种设计逻辑等原因没能成功晋级&#xff0c;但我能从这次备赛中学到很多东西&#xff0c;遂分享一下&#xff0c;与广大网友交流经验。&a…

英伟达发布开源模型Nemotron-4 340B

&#x1f680; 英伟达发布开源模型Nemotron-4 340B 摘要&#xff1a;英伟达最新发布的开源模型Nemotron-4 340B&#xff0c;可能彻底改变大语言模型&#xff08;LLM&#xff09;训练方式。该模型支持多种自然语言和编程语言&#xff0c;使用9万亿个token训练&#xff0c;高达9…

Day 26:2288. 价格减免

Leetcode 2288. 价格减免 句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 ‘$’ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 “$100”、…

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统&#xff0c;部署SQL_Server 2019为例&#xff0c;同系列系统软件安装步骤类似。 一、部署前准备&#xff1b; 下载好相关镜像文件&#xff1b;设备系统启动后&#xff0c;将不必要的软件停用&#xff0c;避…

【Linux】shell——条件判断test,各种运算符,expr

条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与&#xff0c;前面为真后面才会执行 || -->逻辑或&#xff0c;前面为假后面才…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具&#xff0c;该工具使用LibAFL构建&#xff0c;可以利用VirtIO向目标设备的内核子系统提供输入测试用例&#xff0c;广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust&#xff1b; 2、修补的Q…

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足&#xff1a;内标相等 矩阵相乘之后的结果&#xff1a;前行后列 需要注意&#xff1a;1.矩阵的乘法不具有交换律&#xff1a;AB!BA 2.矩阵的乘法满足分配律&#xff1a;A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…

算法金 | 一个强大的算法模型:t-SNE !!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff09;是一种用于降维和数据可视化的非线性算法。它被广泛应用于…

LeetCode 算法:合并两个有序链表 c++

原题链接&#x1f517;&#xff1a;合并两个有序链表 难度&#xff1a;简单⭐️ 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;…

AI智能盒子助力中钢天源设备工厂升级安全防护

中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司&#xff0c;主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中&#xff0c;采用并定制开发一系列厂区安全…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

Python期末复习题库(上)

1. (单选题) Python源程序的扩展名为&#xff08; A &#xff09; A. py B. c C. class D. ph 2. (单选题) 下列&#xff08; A &#xff09;符合可用于注释Python代码。 A. # B. */ C. // D. $ 3. (单选题)下列关于Python 语言的特点的说法中&#xff0c;错误的是&#xf…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode&#xff1a; w方式打开文件&#xff1a;1、如果被打开文件不存在&#xff0c;系统会在使用fopen函…

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变&#xff0c;平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…

零基础入门学用Arduino 第四部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试&#xff0c;支持生成html格式的测试报告&#xff0c;如下图所示&#xff0c;使用"npx playwright test"执行测试&#xff0c;执行完成后&#xff0c;会提示“npx playwright show-report”命令。执行该命令&#…