Tomcat是使用最广的Java Web容器,功能强大,可扩展性强。最新版本的Tomcat(5.5.17)为了提高响应速度和效率,使用了Apache Portable Runtime(APR)作为最底层,使用了APR中包含Socket、缓冲池等多种技术,性能也提高了。APR也是Apache HTTPD的最底层。可想而知,同属于ASF(Apache Software Foundation)中的成员,互补互用的情况还是很多的,虽然使用了不同的开发语言。
Tomcat 的线程池位于tomcat-util.jar文件中,包含了两种线程池方案。
方案一:使用APR的Pool技术,使用了JNI;
方案二:使用Java实现的ThreadPool。这里介绍的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码。
ThreadPool默认创建了5个线程,保存在一个200维的线程数组中,创建时就启动了这些线程,当然在没有请求时,它们都处理“等待”状态(其实就是一个while循环,不停的等待notify)。如果有请求时,空闲线程会被唤醒执行用户的请求。
具体的请求过程是: 服务启动时,创建一个一维线程数组(maxThread=200个),并创建空闲线程(minSpareThreads=5个)随时等待用户请求。 当有用户请求时,调用 threadpool.runIt(ThreadPoolRunnable)方法,将一个需要执行的实例传给ThreadPool中。其中用户需要执行的实例必须实现ThreadPoolRunnable接口。 ThreadPool 首先查找空闲的线程,如果有则用它运行要执行ThreadPoolRunnable;如果没有空闲线程并且没有超过maxThreads,就一次性创建 minSpareThreads个空闲线程;如果已经超过了maxThreads了,就等待空闲线程了。总之,要找到空闲的线程,以便用它执行实例。找到后,将该线程从线程数组中移走。 接着唤醒已经找到的空闲线程,用它运行执行实例(ThreadPoolRunnable)。 运行完ThreadPoolRunnable后,就将该线程重新放到线程数组中,作为空闲线程供后续使用。
由此可以看出,Tomcat的线程池实现是比较简单的,ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程,每次以一个较小步伐(5个)创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程,用完后,再“归还”给线程池。
tomcat5.5.10以上版本支持apr,支持通过apache runtime module进行JNI调用,使用本地代码来加速网络处理。
如果不使用apr之前,Tomcat的Servlet线程池使用的是阻塞IO的模式,使用apr之后,线程池变成了 NIO的非阻塞模式,而且这种NIO还是使用了操作系统的本地代码,看tomcat文档上面的说法是,极大提升web处理能力,不再需要专门放一个web server处理静态页面了。
我自己直观的感受是,不用apr之前,你配置多少个等待线程,tomcat就会启动多少个线程挂起等待,使用apr以后,不管你配置多少,就只有几个NIO调度的线程,这一点你可以通过kill -3 PID,然后察看log得知。
假设不使用apr,可能端口的线程调度能力比较差,所以通过iptables进行端口转发,让两个端口去分担一个端口的线程调度,就有可能减少线程调度的并发,从而提高处理能力,减少资源消耗。
转自http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/da3a56441965cb3386947350.html
分享到:
相关推荐
Tomcat提供了两种线程池实现,一种是基于Apache Portable Runtime (APR)的Pool技术,另一种是纯Java实现的ThreadPool。本文主要探讨后者,即Java实现的线程池。 Java实现的线程池位于`tomcat-util.jar`中,初始化时...
用C#托管代码实现的线程池 它在管理线程的时候,有一个缓存线程的池,即一个ArrayList对象 它一开始就初始化了一定数量的线程,并通过ProcessQueuedItems方法保证异步执行进入池中的队列任务 这样在分配异步任务的...
在本篇内容中,我们将根据标题“ThreadPool UML图”和描述“线程池的架构UML图。可以利用架构UML更好的理解线程池的工作原理。此时可以更好的进行代码的运用。”以及提供的部分代码片段,来深入探讨线程池的相关知识...
- 使用`ThreadPool.SetMinThreads`和`ThreadPool.SetMaxThreads`方法可以调整线程池的最小和最大线程数,但这通常只在特殊情况下进行,因为线程池有其内部的智能管理机制。 在实际开发中,理解并熟练运用线程池API...
这个库在.NET框架中提供了一个替代默认线程池(System.Threading.ThreadPool)的选择,尤其适用于需要更精细控制线程池行为的应用场景。SmartThreadPool具有许多高级特性,比如工作项优先级、自定义线程优先级、线程...
// 关闭工作项和线程池 CloseThreadpoolWork(work); CloseThreadpool(pool); TeardownThreadpoolEnvironment(&environ); return 0; } ``` 在这个例子中,`WorkerFunction`是我们的工作函数,`main`函数负责...
线程池(ThreadPool)是一种管理线程资源的有效方式,它在现代并发编程中扮演着至关重要的角色。线程池允许程序预先创建一组线程,而不是每次需要时都创建新的线程,这样可以减少线程的创建和销毁开销,提高系统效率...
C#中的线程池是一种高效的线程管理机制,它由.NET框架提供,旨在优化系统资源的使用,提高多线程程序的性能。...在实践中,结合异步编程模型(如`async/await`关键字)和线程池可以构建出更高效、更健壮的并发应用。
通过分析和理解“线程池threadpool_src”的源代码,开发者可以学习如何自定义线程池,如何优化任务调度策略,以及如何在多线程环境下保证程序的稳定性和效率。同时,了解线程池的工作原理对于提升软件的并发处理能力...
ThreadPool 线程池管理单元 带调用例子
总之,Tomcat的线程池机制是其高性能和高并发能力的关键所在,通过对`ThreadPool`、`ControlRunnable`、`MonitorRunnable`等类的深入解析,我们不仅能够理解其内部的工作原理,还能学习到如何在自己的项目中设计和...
一个易于使用的C ++ 11线程池。 使用ThreadPool类对自由函数进行排队,并使用std :: for_each()和std :: transform()的并行版本。 可配置为仅用于标头或与库一起使用。 有许多用法示例。
线程池ThreadPool。
本文将详细介绍Python线程池Threadpool的实现,涉及的概念、设计和编程方法,适合希望深入理解和使用Python线程池的开发者。 首先,让我们了解线程池中的核心组件。线程池Threadpool实现篇中会涉及到以下术语和概念...
Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...
DELPHI的线程池(ThreadPool)是一种高效管理并发任务的技术,它允许程序在需要时创建线程,而不是每次需要执行任务时都手动创建。线程池通过预先创建一组线程,然后根据需要分配任务,减少了线程创建和销毁的开销,...
《Linux平台下C语言实现线程池:zl_threadpool》 ...这个开源项目不仅是一个实用的工具,也是学习多线程编程和线程池设计的良好实例。通过阅读和理解其源码,开发者可以深入理解线程池的工作原理,提升自己的编程技能。
线程池(ThreadPool)是多线程编程中的一个重要概念,它是一种线程使用模式,用于高效地管理和调度线程资源。在C++中实现线程池可以帮助开发者优化并发执行的任务,减少线程创建和销毁的开销,提高系统效率。下面...
线程池(ThreadPool)是一种多线程编程的高级管理机制,它通过预先创建一组线程并维护一个线程集合,来高效地处理并发任务。在Windows API中,线程池被广泛使用,提供了诸如CreateThreadPool、CloseThreadPool、...