java实现线程池的几种方式,java中线程池的作用
00-1010 1.池技术2。池技术应用2.1线程池2.2内存池2.3数据库连接池2.4 HttpClient连接池3。线程池简介4。线程池优势分析1:重用线程,减少资源消耗2:提高响应速度3:控制线程和任务数量4:更多增强功能总结前言:
在Java语言中,有两种方法可以提高程序的执行效率,一种是使用线程,另一种是使用线程池。在生产环境中,我们通常采用后者。为什么会这样?今天,我们来谈谈线程池的优点,以及池技术及其应用。
00-1010池化技术指的是提前准备,的一些资源,需要的时候可以提前在重复使用准备好。池技术有两个优点:提前准备和重用。以Java语言的对象创建为例。创建对象时,您必须经历以下步骤:
根据新标识符后的参数,在常量池中查找该类的符号引用;如果没有找到符号应用(类没有加载),加载、解析并初始化类;为堆中的虚拟机分配内存,将分配的内存初始化为0,为对象头建立相应的描述结构(耗时操作:在堆中寻找空闲区域,修改内存分配状态等。);调用对象的初始化方法(耗时操作:对用户和其他操作进行复杂的逻辑验证,比如IO,数值计算是否符合规定等。).从上面的过程可以看出,创建一个类需要复杂耗时的操作,所以我们应该尽量复用已有的类,以确保程序的高效运行,当然如果能够提前创建这些类就再好不过了,而这些功能的实现依靠的就是池化技术.
00-1010常见的池化技术的应用有:线程池、内存池、数据库连接池、HttpClient连接池等。接下来,我们分开来看。
00-1010线程池的原理很简单,类似于操作系统中缓冲区的概念。线程池中将首先启动多个线程,所有这些线程都处于睡眠状态。当客户端有新的请求时,它会唤醒线程池中的一个休眠线程,让它处理客户端的请求。处理完请求后,线程将再次处于休眠状态。线程池可以大大提高程序的性能。比如有一个银行网点中心,省级数据集中较大,高峰期每秒钟客户端请求数超过100个。如果为每个客户端请求创建一个新的线程,那么消耗的CPU时间和内存将是惊人的。如果采用200个线程的线程池,会节省大量的系统资源,将更多的CPU时间和内存用于处理实际的商业应用,而不是频繁的线程创建和销毁。
00-1010如何更好的管理应用内存的使用,同时增加内存的使用频率,是每个开发者值得深思的问题。内存池提供了一个可行的解决方案。在创建内存池的过程中,会预先分配足够大的内存,形成一个初步的内存池。然后,每次用户请求内存时,将返回内存池中的一个空闲内存,并将该内存的标志设置为已用。内存用完释放的时候,其实并不是调用free或者delete的过程,而是把内存放回内存池的过程,在放回的过程中要把标志设置为idle。最后,当应用程序结束时,内存池将被销毁,内存池中的所有内存都将被释放。内存池的优点:
这个优势可以从创建内存池的过程中看出。当我们创建一个内存池时,所有的常规内存块都被分配以减少内存碎片的产生。提高了存储器的使用频率。这从分配和释放内存的过程就可以看出来。每次分配和释放都不是调用系统提供的函数或运算符来操作实际内存,而是重用内存池中的内存。内存池的缺点:它会造成内存浪费,因为要使用内存池,一开始就需要分配一大块空闲内存,而这些内存并不一定都被使用。
00-1010数据库连接池的基本思想是在系统初始化时,将数据库连接作为一个对象存储在内存中。当用户需要访问数据库时,他们不是建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用后,用户不关闭连接,而是将连接放回连接池中,以备下一次请求。连接池本身管理这些连接的建立和断开。同时,您还可以设置连接池的参数来控制初始连接数、连接的上下限、每个连接的最大使用次数和最大空闲时间等。当然,你也可以通过连接池本身的管理机制来监控连接的数量和使用情况。
目录
HttpClient我们经常用它来进行HTTP服务访问。在我们的项目中,将有一个使用HttpCli获取任务执行状态的函数。
ent,一秒钟请求一次,经常会出现 Conection Reset 异常。经过分析发现,问题是出在 HttpClient 的每次请求都会新建一个连接,当创建连接的频率比关闭连接的频率大的时候,就会导致系统中产生大量处于 TIME_CLOSED 状态的连接,这个时候使用连接池复用连接就能解决这个问题。
3.线程池介绍
线程池是线程使用的一种模式,它将线程和任务的概念分离开,使用线程来执行任务,并提供统一的线程管理和任务管理的实现方法,避免了频繁创建和销毁线程所带来的性能开销。
4.线程池优点分析
线程池相比于线程来说,它不需要频繁的创建和销毁线程,线程一旦创建之后,默认情况下就会一直保持在线程池中,等到有任务来了,再用这些已有的线程来执行任务,
如下图所示:
优点1:复用线程,降低资源消耗
线程在创建时要开辟虚拟机栈、本地方法栈、程序计数器等私有线程的内存空间,而销毁时又要回收这些私有空间资源,
如下图所示:
而线程池创建了线程之后就会放在线程池中,因此线程池相比于线程来说,第一个优点就是可以复用线程、减低系统资源的消耗。
优点2:提高响应速度
线程池是复用已有线程来执行任务的,而线程是在有任务时才新建的,所以相比于线程来说,线程池能够更快的响应任务和执行任务。
优点3:管控线程数和任务数
线程池提供了更多的管理功能,这里管理功能主要体现在以下两个方面:
控制最大并发数:线程池可以创建固定的线程数,从而避免了无限创建线程的问题。当线程创建过多时,会导致系统执行变慢,因为 CPU 核数是一定的、能同时处理的任务数也是一定的,而线程过多时就会造成线程恶意争抢和线程频繁切换的问题,从而导致程序执行变慢,所以合适的线程数才是高性能运行的关键。控制任务最大数:如果任务无限多,而内存又不足的情况下,就会导致程序执行报错,而线程池可以控制最大任务数,当任务超过一定数量之后,就会采用拒绝策略来处理多出的任务,从而保证了系统可以健康的运行。
优点4:更多增强功能
线程池相比于线程来说提供了更多的功能,比如定时执行和周期执行等功能。
总结
池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。
池化技术的优点主要有两个:
提前准备和重复利用。线程池是池化技术的典型场景,线程池的优点主要有 4 点:
1.复用线程,降低了资源消耗;2.提高响应速度;3.提供了管理线程数和任务数的能力;4.更多增强功能。到此这篇关于Java线程池的优点及池化技术的应用的文章就介绍到这了,更多相关Java池化技术内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。