线程池学习

5人阅读 评论(0) 收藏 举报
分类:

线程池学习

http://www.cnblogs.com/easycloud/p/3726089.html
在面向对象编程中,对象创建和销毁是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是对一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因。比如大家所熟悉的数据库连接池就是遵循这一思想而产生的,下面将介绍的线程池技术同样符合这一思想。

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。但如果对多线程应用不当,会增加对单个任务的处理时间。可以举一个简单的例子:

假设一台服务器完成一项任务的时间为T

 T1 创建线程的时间

 T2 在线程中执行任务的时间,包括线程间同步所需时间

 T3 线程销毁的时间

显然T = T1+T2+T3。注意这是一个极度简化的假设。

可以看出T1,T3是多线程本身附加的开销,用户希望减少T1,T3所用的时间,从而减少T的时间。但一些线程的使用者并没有注意到这一点,所以在应用程序中频繁的创建或销毁线程,这导致T1和T3在T中占有非常大的比例。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了,线程池不仅调整T1,T3产生的时间,而且它还显著减少了创建线程的数目。在看一个例子:

假设一台服务器每天大约要处理100000个请求,并且每个请求需要一个单独的线程完成,这是一个很常用的场景。在线程池中,线程数量一般是固定的,所以产生线程总数不会超过线程池中线程的数目或者上限,而如果服务器不利用线程池来处理这些请求则线程总数为100000。一般线程池尺寸是远小于100000。所以利用线程池的服务器程序不会为了创建100000而在处理请求时浪费时间,从而提高效率。

线程池是一种多线程处理方法,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程处于空闲状态,则线程池将会调度一个任务给它,.如果所有线程都始终保持繁忙,但将任务放入到一个队列中,则线程池将在一段时间后创建另一个辅助线程,但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动

线程池主要有如下几个应用范围:

  1. 需要大量的线程来完成任务,且完成任务的时间比较短,如WEB服务器完成网页请求这样的任务。因为单个任务小,而任务数量巨大,比如一个热门网站的点击次数。 但对于长时间的任务,比如一个ftp连接请求,线程池的优点就不明显了。因为ftp会话时间相对于线程的创建时间长多了。

  2. 对性能要求苛刻的应用,比如要求服务器迅速相应客户请求。

  3. 接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限。

下面将讨论线程池的简单实现,以说明线程技术优点及应用领域。

线程池的简单实现

一般一个简单线程池至少包含下列组成部分。

  1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池

  2. 工作线程(WorkThread): 线程池中线程

  3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。

  4. 任务队列:用于存放没有处理的任务。提供一种缓冲机制。

线程池管理器至少有下列功能:创建线程池,销毁线程池,添加新任务 创建线程池的部分代码如下:

查看评论

Java 并发编程深入学习——线程池及其实现原理

Java线程池介绍   线程池,从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列(work Queue)密切相关的,其中工作队列中保存了所有等待执行的任务。工作者线程(Work ...
  • ylyg050518
  • ylyg050518
  • 2016-09-07 23:26:16
  • 1473

muduo网络库源码学习————线程池实现

muduo库里面的线程池是固定线程池,即创建的线程池里面的线程个数是一定的,不是动态的。线程池里面一般要包含线程队列还有任务队列,外部程序将任务存放到线程池的任务队列中,线程池中的线程队列执行任务,也...
  • L979951191
  • L979951191
  • 2015-08-29 18:17:13
  • 1112

java线程池学习(二) —— 实现一个简单的线程池

在上一篇文章中《java线程池学习(一) —— BlockingQueue》,我们简单探讨了一个BlockingQueue的概念。 那么在这边文章,我们要利用BlockingQueue来自己实现一个简...
  • Great_Smile
  • Great_Smile
  • 2015-10-03 17:01:29
  • 3132

c#多线程以及线程池的学习

  • 2009年08月02日 19:01
  • 13KB
  • 下载

java线程池学习(三) —— ThreadPoolExecutor

上一篇文章中我们自己写了一个简单的线程池。 这一篇文章我们来了解一下java为我们提供的线程池实现—— ExecutorService接口 它位于jdk的java.util.concurrent包下...
  • Great_Smile
  • Great_Smile
  • 2015-10-03 19:34:25
  • 1387

Java线程的学习_线程池

系统启动一个新线程需要很高的成本,因为它涉及与操作系统交互。在这种情况下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时。...
  • qq_35073878
  • qq_35073878
  • 2016-11-05 21:18:34
  • 129

基于ACE的线程池学习与实现(三)—— 并发编程资料

ACE的线程池编程 http://blog.sina.com.cn/s/blog_6f58214f0100oyip.html 一个基于ACE的负载自适应万能线程池实现 http://www.cp...
  • luson_xing
  • luson_xing
  • 2013-01-18 16:26:41
  • 825

线程池模板 (可以让你快速地使用线程池技术) 帮助你学习线程池

  • 2010年06月16日 17:59
  • 5KB
  • 下载

Java线程池及其底层源码实现分析

相关类: Executors ExecutorService Callable ThreadPool Future 接口: Executor ...
  • qq_17305249
  • qq_17305249
  • 2017-09-05 19:53:20
  • 312

java 线程池 学习代码

  • 2009年12月16日 12:54
  • 34KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 5984
    积分: 470
    排名: 10万+
    文章存档