`

线程池的原理和连接池的原理

阅读更多

一、 线程池的原理:     

线程池,究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:

先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。

可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题——性能!

就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。

 

 

二、 数据库连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 

连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

1)  最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费; 
2)  最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

 

 

三、 linux线程池的C语言实现

通常我们使用多线程的方式是,需要时创建一个新的线程,在这个新的线程里执行特定的任务,然后在任务完成后退出。这在一般的应用里已经能够满足我们应用的需要,毕竟我们并不是什么时候都需要创建大量的线程,并在它们执行一个简单的任务后销毁。

但是在一些webemaildatabase等应用里,比如彩铃,我们的应用在任何时候都要准备应对数目巨大的连接请求,同时,这些请求所要完成的任务却又可能非常的简单,即只占用很少的处理时间。这时,我们的应用有可能处于不停的创建线程并销毁线程的状态。虽说比起进程的创建,线程的创建时间已经大大缩短,但是如果需要频繁的创建线程,并且每个线程所占用的处理时间又非常简短,则线程创建和销毁带给处理器的额外负担也是很可观的。

线程池的作用正是在这种情况下有效的降低频繁创建销毁线程所带来的额外开销。一般来说,线程池都是采用预创建的技术,在应用启动之初便预先创建一定数目的线程。应用在运行的过程中,需要时可以从这些线程所组成的线程池里申请分配一个空闲的线程,来执行一定的任务,任务完成后,并不是将线程销毁,而是将它返还给线程池,由线程池自行管理。如果线程池中预先分配的线程已经全部分配完毕,但此时又有新的任务请求,则线程池会动态的创建新的线程去适应这个请求。当然,有可能,某些时段应用并不需要执行很多的任务,导致了线程池中的线程大多处于空闲的状态,为了节省系统资源,线程池就需要动态的销毁其中的一部分空闲线程。因此,线程池都需要一个管理者,按照一定的要求去动态的维护其中线程的数目。

基于上面的技术,线程池将频繁创建和销毁线程所带来的开销分摊到了每个具体执行的任务上,执行的次数越多,则分摊到每个任务上的开销就越小。

当然,如果线程创建销毁所带来的开销与线程执行任务的开销相比微不足道,可以忽略不计,则线程池并没有使用的必要。比如,FTPTelnet等应用时。

 

 

使用线程池的好处: 

1.减少在创建和销毁线程上所花的时间以及系统资源的开销 
2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 

以下是Java自带的几种线程池: 

1、newFixedThreadPool  创建一个指定工作线程数量的线程池。

 
每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。 

2、newCachedThreadPool 创建一个可缓存的线程池。
 
这种类型的线程池特点是: 

1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。 

2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。 

3、newSingleThreadExecutor 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。
 
单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。 

4、newScheduleThreadPool  创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

总结: 
 

 

一.FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。 

二.CachedThreadPool的特点就是在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源。但是,但当出现新任务时,又要创建一新的工作线程,又要一定的系统开销。并且,在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。 
分享到:
评论

相关推荐

    对象池&线程池&数据库连接池

    对象池、线程池和数据库连接池都是资源复用机制的实例,它们有效地解决了频繁创建和销毁对象带来的开销,提高了系统的效率。以下是对这些概念的详细解释: 1. **对象池**: 对象池是一种设计模式,它的核心思想是...

    线程池和mysql连接池的实现

    线程池和MySQL连接池是两种重要的资源管理技术,在多线程编程和数据库操作中扮演着关键角色。本文将详细探讨这两个概念,并结合在Ubuntu 12.04环境下使用C++实现线程池和MySQL连接池的方法。 线程池是一种优化并发...

    线程池原理及创建(C++实现)

    ### 线程池原理及创建(C++实现) #### 一、线程池的重要性 在现代计算环境中,网络服务器面临着处理大量并发请求的挑战,其中包括但不限于Web服务器、电子邮件服务器和数据库服务器。这类服务器通常需要在短时间...

    okhttp中连接池实现

    本文将深入探讨OkHttp中的连接池实现,包括连接对象的添加、移除机制以及其工作原理。 首先,我们需要了解什么是连接池。连接池是一种资源管理技术,用于存储和管理预先建立的网络连接,避免每次请求都创建新的TCP...

    C# Socket连接池

    本文将深入探讨“C# Socket连接池”的实现原理、优势以及如何利用线程池技术来构建和优化它。同时,我们也会提及Windows计数器在监控和分析线程池性能中的作用。 首先,理解Socket连接池的概念。Socket是网络通信的...

    基于C++实现的连接池、线程池、内存池、对象池项目源码含项目说明.zip

    作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,...

    java手写连接池

    首先,我们要了解数据库连接池的基本原理。数据库连接池在初始化时会创建一定数量的连接,并将它们保存在池中。当一个应用需要与数据库通信时,它会从池中获取一个已存在的连接,而不是每次都去建立新的连接。使用...

    连接池 连接池连接池 连接池

    在IT行业中,数据库连接池是优化数据库访问性能和资源管理的关键技术。连接池,顾名思义,就是一池可以复用的数据库连接。...通过了解和掌握连接池的原理及使用,开发者能够更好地构建高可用、高性能的Java和JSP应用。

    Java版线程池实现

    - `checkThreadPeriod`:检查连接池的周期,用于定期检查和调整线程池状态。 2. **线程列表**: - `m_ThreadList`:工作线程列表,存储当前正在工作的线程。 - `m_ReserveList`:保留线程链表,存储未分配任务的...

    socket线程池

    Socket线程池是一种在Java编程中管理Socket连接的机制,它通过维护一组可重用的线程来提高网络通信的效率和系统资源的利用率。在处理大量并发的Socket连接时,传统的模型可能会创建大量线程,这可能导致内存消耗过大...

    c++数据库线程池

    - 避免资源争抢:通过线程池和连接池的配合,减少了多线程对数据库连接的并发访问,从而降低死锁风险。 - 易于管理和扩展:线程池允许我们设定最大线程数,方便控制系统的并发行为,同时方便监控和调试。 总之,C++...

    apache数据库连接池包

    Apache Tomcat JDBC 连接池 (C3P0 和 DBCP2) 是一个更现代、功能更丰富的连接池实现。相比于 DBCP,它提供了更多的配置选项,如自动检测失效连接、更灵活的连接测试策略、线程池支持等。Tomcat JDBC 连接池支持 JNDI...

    简单线程池与线程池检查的实现

    总结来说,这个主题涵盖了线程池的基本概念、实现原理以及线程池的检查和维护,对于理解和优化多线程环境下的程序性能至关重要。通过源码分析和定制工具,开发者可以更好地控制和监控线程池,提升系统的稳定性和效率...

    xianchengchi.zip_Socket 线程池_socket池_线程池_线程池socket

    2. 线程池中的线程负责与客户端建立Socket连接,接收和发送数据。 3. 如果所有线程都在忙,新来的请求会被放入队列等待,直到有线程可用。 4. 当线程完成任务后,不会立即销毁,而是返回线程池,等待下一次分配任务...

    C++线程池,带PPT 线程池

    在实际应用中,线程池常用于数据库连接池、网络请求处理、大量计算任务等场景,通过合理使用线程池,可以显著提升程序的并发性能和响应速度。 总之,C++线程池是多线程编程中的一个重要工具,理解和掌握其设计与...

    apache线程池

    这个库广泛应用于Java应用程序,尤其是那些需要处理大量并发请求的系统,比如Web服务器和数据库连接池。Apache Commons Pool 1.5.3是该库的一个稳定版本,包含了源代码和API文档,便于开发者理解和自定义线程池行为...

    java 四种连接池测试代码(和博文配套)

    本资源包含了四种不同的Java连接池实现的测试代码,这些代码与相关的博客文章配套,可以帮助开发者更深入地理解各种连接池的工作原理和使用方式。 首先,我们来详细了解一下四种常见的Java连接池: 1. **HikariCP*...

    线程池代码(vc代码)

    理解并掌握线程池的实现原理和使用方法,对于优化系统性能、编写高效稳定的多线程程序至关重要。 总结来说,线程池是多线程编程中的一个重要概念,通过合理管理线程资源,提高了系统效率。VC++中的线程池实现涉及...

Global site tag (gtag.js) - Google Analytics