前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java为什么要使用线程池?

Java为什么要使用线程池?

原创
作者头像
Eulogy
发布于 2025-03-26 15:03:30
发布于 2025-03-26 15:03:30
780
举报
文章被收录于专栏:JavaJava

前言

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

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

如果不使用线程池的话,对于一个系统来说,最多可以使用多少个线程,每个线程最多可以被占用多长时间避免别的任务产生“饥饿”问题都是不好被控制的,可能需要自己编写相应的逻辑来控制,但是如果使用了线程池的话,我就可以规定这个系统所使用的线程都不能自己创建,都只能从这个线程池中来获取,所以我可以使用这个线程池对这个系统会用到的所有线程进行一个统一的管理。

包括以下几个部分的管理:

1.限制最大的线程数量:,防止系统可以获得的线程数量过多,从而导致CPU的大部分时间都用在了切换线程上,而用在处理线程中的任务上的时间所剩无几,降低了效率。同时,如果不限制最大线程数量的话,很有可能导致OOM(OUT OF MEMORY)问题,因为每个线程都是在内存中开辟一个线程栈(Java中的栈空间是JVM控制的,总共就只有那么大。)还会创建一个线程控制块的。

2.代替手动管理: 对于一个线程来说,它的创建、启动、关闭如果全靠程序员去手动管理的话,手动管理起来会非常复杂,还有可能管理不当发生死锁的问题,所以线程池封装了线程管理的机制,代替程序员去更好地管理线程。

3.

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

试想一下,如果没有线程池,那么我每次想要完成一个任务都要创建一个线程,然后在该任务完成之后再将其销毁。

但是要知道线程在创建的时候计算机会在JVM给它规定的线程栈空间中挑出一块合适的内存分配给它,并且还会创建一个线程控制块、执行系统调用指令、在操作系统的线程控制表里维护线程队列......这些操作都会耗费CPU的时间(这些操作也可以叫做线程自身的上下文)。并且在销毁的时候也是,OS 需要释放它占用的栈内存、线程控制块、内核对象。这些都会需要CPU的时间。很浪费性能。

而使用了线程池之后,一切就不一样了。线程池创建 固定数量的线程,当有任务到来时,直接复用现有线程,而不是每次都创建新线程。这样就避免了频繁的系统调用、内存分配、CPU 上下文切换。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor。大家可能了解到它的原理,甚至看过它的源码;但是就像我一样,大家可能对它的作用存在误解。现在问题来了,jdk为什么要提供java线程池?使用java线程池对于每次都创建一个新Thread有什么优势?
哲洛不闹
2018/09/18
7470
Java线程池的那些事
【连载 03】Java 线程池(上)
Java线程池(Thread Pool)是一种线程的使用模式,是一种Java并发编程机制。Java线程池能够有效地管理线程,通过线程复用提升使用效率。当我们使用的线程一旦变多,特别在进行高性能测试时,线程池就是我们唯一的选择。
FunTester
2025/01/23
990
【连载 03】Java 线程池(上)
为什么需要线程池?什么是池化技术?
在 Java 语言中,提高程序的执行效率有两种实现方法,一个是使用线程、另一个是使用线程池。而在生产环境下,我们通常会采用后者。为什么会这样呢?今天我们就来聊聊线程池的优点,以及池化技术及其应用。
PHP开发工程师
2022/03/02
7200
为什么需要线程池?什么是池化技术?
线程(Thread)的基本概念
如果说,在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。为什么?
一个风轻云淡
2023/10/15
3670
线程(Thread)的基本概念
深入理解 Java 线程池的实现原理
如上述代码所示,其来自于java.lang.Thread类,State为Thread类的内部公共枚举类,表示线程的 6 种状态。
CG国斌
2021/12/07
2880
深入理解 Java 线程池的实现原理
Java线程池的总结
在当今计算机的CPU计算速度非常快的情况下,为了能够充分利用CPU性能提高程序运行效率我们在程序中使用了线程。但是在高并发情况下会频繁的创建和销毁线程,这样就变相的阻碍了程序的执行速度,所以为了管理线程资源和减少线程创建以及销毁的性能消耗就引入了线程池。
后端码匠
2020/02/25
7660
21.3 Java 线程池
线程是在一个进程中可以执行一系列指令的执行环境,或称运行程序。多线程编程指的是用多个线程并行执行多个任务。当然,JVM 对多线程有良好的支持。
acc8226
2022/05/17
3700
21.3 Java 线程池
进程管理And线程实现
动态性 : 可动态地创建, 结果进程; 并发性 : 进程可以被独立调度并占用处理机运行; (并发:一段, 并行:一时刻) 独立性 : 不同进程的工作不相互影响;(页表是保障措施之一) 制约性 : 因访问共享数据, 资源或进程间同步而产生制约.
用户11097514
2024/05/31
1730
进程管理And线程实现
JAVA线程之线程池(七)
1.不一定是越多越好,首先线程在java里面是一个对象,只要是对象肯定要占用一定的资源,更多的是操作系统保护的资源,线程的创建和销毁都需要时间和空间,如果线程的(创建时间+销毁时间)大于执行时间 就很不划算了。举个例子,创建时间1秒,销毁时间1秒,任务执行也就是1秒,这就没必要搞一个新的线程了,就考虑线程能否复用。 2.java对象占用堆内存,操作系统的线程也会占用内存,对象本身也会占用堆内存,根据JVM规范一个线程最大的栈是1M,达到最大了,栈空间就需要去系统内存中进行分配的,线程不管是占用了多少,只要线程一多,会消耗更多的内存。 3.多线程下操作系统在处理的时候,CPU时间片的增强就会有一个频繁的切换系统上下文,每个线程都想被运行,导致每个线程都执行的很慢,不能专心执行某一个线程。
IT架构圈
2020/06/10
1K0
相关推荐
Java线程池的那些事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档