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

Java为什么要使用线程池?

  • 前言
    • 1.对线程的管理更加的规范化
    • 2.降低创建线程和销毁线程的开销

前言

之前对于Java线程池的理解,一直停留在:对于Java中的多线程机制来说,如果不使用线程池的话,线程的使用就会变得杂乱无章。这一步。一直没有深入去理解为什么其更深层次的原因,今天来仔细思考一下,并记录我自己的理解。
在这里插入图片描述

1.对线程的管理更加的规范化

如果不使用线程池的话,对于一个系统来说,最多可以使用多少个线程,每个线程最多可以被占用多长时间避免别的任务产生“饥饿”问题都是不好被控制的,可能需要自己编写相应的逻辑来控制,但是如果使用了线程池的话,我就可以规定这个系统所使用的线程都不能自己创建,都只能从这个线程池中来获取,所以我可以使用这个线程池对这个系统会用到的所有线程进行一个统一的管理。
包括以下几个部分的管理:
1.限制最大的线程数量:,防止系统可以获得的线程数量过多,从而导致CPU的大部分时间都用在了切换线程上,而用在处理线程中的任务上的时间所剩无几,降低了效率。同时,如果不限制最大线程数量的话,很有可能导致OOM(OUT OF MEMORY)问题,因为每个线程都是在内存中开辟一个线程栈(Java中的栈空间是JVM控制的,总共就只有那么大。)还会创建一个线程控制块的。
2.代替手动管理: 对于一个线程来说,它的创建、启动、关闭如果全靠程序员去手动管理的话,手动管理起来会非常复杂,还有可能管理不当发生死锁的问题,所以线程池封装了线程管理的机制,代替程序员去更好地管理线程。
3.

2.降低创建线程和销毁线程的开销

试想一下,如果没有线程池,那么我每次想要完成一个任务都要创建一个线程,然后在该任务完成之后再将其销毁。
但是要知道线程在创建的时候计算机会在JVM给它规定的线程栈空间中挑出一块合适的内存分配给它,并且还会创建一个线程控制块、执行系统调用指令、在操作系统的线程控制表里维护线程队列…这些操作都会耗费CPU的时间(这些操作也可以叫做线程自身的上下文)。并且在销毁的时候也是,OS 需要释放它占用的栈内存、线程控制块、内核对象。这些都会需要CPU的时间。很浪费性能。
而使用了线程池之后,一切就不一样了。线程池创建 固定数量的线程,当有任务到来时,直接复用现有线程,而不是每次都创建新线程。这样就避免了频繁的系统调用、内存分配、CPU 上下文切换。

相关文章:

  • 【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)
  • 用Python和Stable Diffusion生成AI动画:从图像到视频的全流程指南
  • MYSQL基本语法使用
  • java八股文之JVM
  • 【Mysql】深入理解 MySQL 索引:原理、类型与实践
  • leetcode每日一题:酿造药水需要的最少总时间
  • Ant Design Vue 中的table表格高度塌陷,造成行与行不齐的问题
  • 测试用例生成平台通过大模型升级查询功能,生成智能测试用例
  • 为AI聊天工具添加一个知识系统 之150 设计重审 之15 完整方案及评估 之2
  • 搭建一套正版上门按摩小程序需要具备哪些功能?
  • 预编译能否 100%防 sql 注入?
  • 解锁智能制造新体验:兰亭妙微 UE/UI 设计赋能行业变革
  • How to connect Internet wifi on vmware for Win11 installation?
  • 蓝桥杯题型分布2
  • 【Gobuster 详细使用教程】
  • 力扣hot100_二分查找
  • 如何 编译 px4
  • 乐仓VUE常用点
  • 工具介绍《WireShark》
  • 结构型设计模式
  • “乐购浦东”消费券明起发放,多个商家同期推出折扣促销活动
  • 这座“蚌埠住了”的城市不仅会接流量,也在努力成为文旅实力派
  • 人民日报评论员:汇聚起工人阶级和广大劳动群众的磅礴力量
  • 王毅会见俄罗斯外长拉夫罗夫
  • 俄罗斯总统普京:5月8日零时至11日零时实施停火
  • 美乌总统梵蒂冈会谈,外交部:望有关各方继续通过对话谈判解决危机