任务执行器——Executor
上节说到接收器Acceptor在接收到socket后会有一系列简单的处理,其中将socket扔进线程池是最重要的一步,线程池是一个怎样东西?其原理在前面的“线程池原理”章节已经说明过了,这里重点讲tomcat中用于处理客户端请求的线程池——Executor。
为确保整个web服务器的性能,应该在接到请求后以最快的速度转交到其他线程上去处理。在接收到客户端的请求后tomcat将对这些请求交给任务执行器Executor,它是一个拥有最大最小线程数限制的线程池,之所以称之为“任务执行器”是因为线程池可以看做是启动了若干线程不断检测某个任务队列,一旦发现有需要执行的任务则执行。如下图,每条线程都不断循环检测任务队列,数量不会少于最小线程数也不能大于最大线程数。
任务执行器的具体实现是使用juc工具包的ThreadPoolExecutor类,它提供了拥有多种机制的线程池,例如有最大最小线程数限制、多余线程回收时间限制、超出最大线程数时线程池做出的拒绝动作等等。继承此类并重写一些方法基本就能满足tomcat个性化需求。
Tomcat的Executor分为两种类型:外部Executor和内部Executor。所谓外部Executor则指程序运行时使用server.xml文件配置的Executor。可以在server.xml文件中通过类似如下配置进行自定义,它表示任务执行器的最大线程数为150,最小线程数为4,线程名前缀为catalina-exec-。
…
<service>
<Executorname="tomcatThreadPool"namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool" port="8080"protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
</service>
…
而内部Executor是指未通过server.xml配置<Executor/>时使用程序里面默认的Executor;这种情况下默认的Executor将成为客户端请求的处理器,它的最小线程数为10,最大线程数为200,线程名字前缀为TP-exec-,线程池里面的线程全部为守护线程,线程数超过10时等待60秒如果还没任务执行的话将销毁此线程。设置为守护进程是为了保证在应用关闭时能同时即使线程池中有正在处理请求的线程也能正常关闭。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
任务执行器——Executor的更多相关文章
- mybatis源码阅读-执行器Executor(四)
说明 前面二看到了 sqlSession最终是找到MapperStatement然后委托给Executer执行的 Executer到底做了什么 接口定义 public interface Execut ...
- MyBatis中执行器Executor框架
与JDK提供的Executor框架类似,MyBatis也提供了一套Executor框架,具体如下图: 其为Mybatis提供与数据库交互的功能,是一个典型的装饰器模式的应用--对JDBC功能的封装,同 ...
- 调用的执行器“executor://mstestadapter/v2”时发生异常: 无法找到程序集“log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”
加上下面的一句就好了 [TestCleanup] public void cleanup() { CallContext.FreeNamedDataSlot(&q ...
- storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解
本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...
- 跟我一起读postgresql源码(八)——Executor(查询执行模块之——可优化语句的执行)
2.可优化语句的执行 可优化语句的共同特点是它们被查询编译器处理后都会生成査询计划树,这一类语句由执行器(Executor)处理.该模块对外提供了三个接口: ExecutorStart.Executo ...
- Java基础系列--Executor框架(一)
文章来源:http://www.cnblogs.com/V1haoge/p/8393618.html 一.Executor框架介绍 Executor框架是JDK1.5之后出现的,位于juc包中,是并发 ...
- mybatis源码解析9---执行器Executor解析
从前面分析我们知道了sql的具体执行是通过调用SqlSession接口的对应的方法去执行的,而SqlSession最终都是通过调用了自己的Executor对象的query和update去执行的.本文就 ...
- Executor框架(六)CompletionService 接口
CompletionService 接口是一个独立的接口,并没有扩展 ExecutorService . 其默认实现类是ExecutorCompletionService; 接口 Comple ...
- Netty源码分析第2章(NioEventLoop)---->第1节: NioEventLoopGroup之创建线程执行器
Netty源码分析第二章: NioEventLoop 概述: 通过上一章的学习, 我们了解了Server启动的大致流程, 有很多组件与模块并没有细讲, 从这个章开始, 我们开始详细剖析netty的各个 ...
随机推荐
- Linux设备树语法详解【转】
转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...
- B/S与C/S架构
1.CS.BS架构定义 CS(Client/Server):客户端----服务器结构.C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据. ...
- android高德地图网络路径实现自定义marker并点击弹出自定义窗口
android中使用地图的地方随处可见,今天记录一下网络路径生成自定义marker,点击标记弹出自定义的窗口(在这里使用的是高德地图) 在这里我们使用Grilde去加载网络图片,因为这个简直太方便了! ...
- 微信内置浏览器 如何小窗不全屏播放视频?也可以尝试canvas.
设置属性: <video height="100%" width="100%" autoplay="autoplay" control ...
- SQL部分常用指令整理
dual 伪表 用来测试函数和表达式 1.查询EMP表中所有人的信息,结果格式样例为"某人的月薪是1000$" SELECT ENAME||'的月薪是'||SAL||'$' FRO ...
- 闭关修炼屯题中,期末考完A
FJUTOJ 1279 #include <cstdio> #include <iostream> #include <algorithm> #include &l ...
- docker volume创建、备份、nfs存储
docker存储volume #环境 centos7.4 , Docker version 17.12.0-ce docker volume创建.备份.nfs存储 #docker volume 数据存 ...
- Linux下的有用命令
在之前的博客<Linux下常用命令与使用技巧>中,介绍了Linux的常用命令,在今天的博客中,给大家介绍其他的有用命令. 1.文本转换命令 在Linux下工作,我们不可避免地要和文件格式做 ...
- Linux 虚存 linux2.6内核特性
一.大型页面的支持 当代计算机体系结构大都支持多种页面大小,例如,IA-32体系结构支持4KB或4MB的页面, Linux操作系统只是将大型页面用于映射实际的内核映像.大型页面的使用主要是为了改进高性 ...
- Spark编译及spark开发环境搭建
最近需要将生产环境的spark1.3版本升级到spark1.6(尽管spark2.0已经发布一段时间了,稳定可靠起见,还是选择了spark1.6),同时需要基于spark开发一些中间件,因此需要搭建一 ...