当前位置: 首页 > 后端技术 > Java

为什么需要线程池?什么是池化技术?

时间:2023-04-01 16:51:34 Java

在Java语言中,有两种提高程序执行效率的方法,一种是使用线程,另一种是使用线程池。在生产环境中,我们通常使用后者。为什么会这样?今天我们就来聊一聊线程池的优势,以及池化技术及其应用。1.池化技术池化技术是指预先准备一些资源,这些预先准备好的资源可以在需要的时候重新使用。池化技术有两个主要优点:提前准备和重用。以Java语言中的对象创建为例,在创建对象时需要进行以下步骤:根据new标识符后面的参数,在常量池中查找该类的符号引用;如果没有找到symbolapplication(类没有加载),则执行类的加载、解析、初始化等;虚拟机为堆中的对象分配内存,并将分配的内存初始化为0,并为对象头建立相应的描述结构(耗时操作:需要在堆中找到空闲区域,修改内存分配状态,ETC。);调用对象的初始化方法(耗时操作:用户的复杂逻辑校验等操作,如IO,数值计算是否符合规定等)。从上面的过程可以看出,创建一个类需要复杂且耗时的操作,所以我们应该尽可能的复用已有的类,以保证程序的高效运行。当然,如果能提前创建这些类就好了,而这些功能的实现依赖于池化技术。2、池化技术的应用常见的池化技术应用包括:线程池、内存池、数据库连接池、HttpClient连接池等,下面我们分别来看。2.1线程池线程池的原理很简单,类似于操作系统中缓冲区的概念。线程池中会先启动一定数量的线程,这些线程都处于休眠状态。当客户端有新的请求时,会唤醒线程池中一个休眠的线程,让它处理客户端的请求。处理完请求后,线程再次进入休眠状态。线程池可以大大提高程序的性能。比如有一个银行网络中心,省级数据集中度很大。高峰期客户端每秒并发请求数超过100。如果为每个客户端请求都创建一个新的线程,将会消耗大量的CPU时间和内存。令人惊讶的是,如果使用200个线程的线程池,会节省大量的系统资源,从而有更多的CPU时间和内存可以用来处理实际的业务应用,而不是频繁的线程创建和销毁。2.2内存池如何更好的管理应用程序的内存使用,同时提高内存的使用频率,是值得每一位开发者深思的问题。内存池(MemoryPool)提供了一种更可行的解决方案。在创建内存池的过程中,会预先分配足够的内存,形成一个初步的内存池。然后每次用户申请内存时,都会返回内存池中的一块空闲内存,并设置这块内存的flag为used。当内存用完释放内存时,并不是真正调用free或delete的过程,而是将内存存回内存池的过程,放回的过程应该设置flag为idle.最后,当应用程序结束时,内存池会被销毁,内存池中的每一块内存都会被释放。内存池的优点:减少内存碎片的产生。从创建内存池的过程就可以看出这个优势。我们在创建内存池的时候,会分配比较有规律的内存块,以减少内存碎片的产生。.增加内存使用频率。这从分配和释放内存的过程就可以看出来。每次分配和释放并不是调用系统提供的函数或运算符来操作实际的内存,而是对内存池中的内存进行复用。内存池的缺点:会造成内存的浪费,因为要使用内存池,一开始需要分配一大块空闲内存,而这块内存可能全部都用不到。2.3数据库连接池数据库连接池的基本思想是在系统初始化时,将数据库连接作为一个对象存储在内存中。当用户需要访问数据库时,不是建立新的连接,而是从一个已有的连接池中取出已建立的空闲连接对象。用户使用后并没有关闭连接,而是将连接放回连接池中供下一次请求访问,而这些连接的建立和断开都是由连接池自己管理的。同时还可以通过设置连接池的参数来控制连接池的初始连接数、连接数上下限、每个连接的最大使用次数、最大空闲时间.当然也可以通过连接池本身的管理机制来监控连接的数量和使用情况。2.4HttpClient连接池HttpClient常用于HTTP服务访问。在我们的项目中,会有一个使用HttpClient获取任务执行状态的函数,每秒请求一次,经常会出现连接重置异常。经过分析,发现问题是HttpClient的每次请求都会新建一个连接。当创建连接的频率高于关闭连接的频率时,会导致系统中出现大量处于TIME_CLOSED状态的连接。这时候连接池使用Multiplexingconnections可以解决这个问题。3.线程池介绍线程池是线程使用的一种模式,将线程和任务的概念分离,使用线程来执行任务,并提供了统一的线程管理和任务管理实现方法,避免了频繁创建和销毁带来的性能开销线程。4、线程池优势分析与线程相比,线程池不需要频繁创建和销毁线程。一个线程一旦被创建,它会默认保留在线程池中。当一个任务来的时候,它会再次被使用。这些现有线程用于执行任务,如下图所示:优势一:复用线程,减少资源消耗。线程在创建时需要为私有线程开辟虚拟机栈、本地方法栈、程序计数器等内存空间。还需要回收这些私有空间资源,如下图所示:线程池创建线程后,会放入线程池中。因此,与线程相比,线程池的第一个优势就是可以重用线程,降低系统开销。资源消耗。优势二:提高响应速度线程池复用已有的线程来执行任务,只有在有任务的时候才会创建线程,所以相对于线程,线程池可以更快的响应和执行任务。优势三:控制线程数和任务数。线程池提供了更多的管理功能。这里的管理功能主要体现在以下两个方面:控制最大并发数:线程池可以创建固定数量的线程,从而避免无限创建线程的问题。当线程创建过多时,系统的执行速度会变慢,因为CPU核心数是固定的,同时可以处理的任务数也是固定的,而当线程过多时,会造成线程恶意争用,线程频繁切换。它会导致程序执行速度变慢,因此适当的线程数是高性能运行的关键。控制最大任务数:如果任务数无限大,内存不足,会报程序执行错误,线程池可以控制最大任务数。当任务数量超过一定数量时,将采用拒绝策略处理超出的任务,从而保证系统的健康运行。优势四:更多的增强功能线程池提供了比线程更多的功能,比如定时执行、周期执行等。总结Pooling技术是指提前准备一些资源,这些预先准备好的资源可以在需要的时候重新使用。池化技术有两个主要优点:提前准备和重用。线程池是池化技术的典型场景。线程池主要有四大优势:1.多路复用线程,减少资源消耗;2、提高响应速度;3.提供管理线程数和任务数的能力;4..更多增强功能。判断是非在己,名誉在人,得失在数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview