任务执行器——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秒如果还没任务执行的话将销毁此线程。设置为守护进程是为了保证在应用关闭时能同时即使线程池中有正在处理请求的线程也能正常关闭。

点击订购作者《Tomcat内核设计剖析》

时间: 2024-12-23 05:13:56

任务执行器——Executor的相关文章

C和指针

前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长期存在下去.事实上,我自己不用C语言写程序已经有一年了,工作中接触到的只有java,python和javascript.最近用C完成了一下类似于OO中的封装(即"类")的概念,顺便把指针复习了下,感觉有必要记一下. 本文中的例子有这样两个概念:任务(Task),执行器(Executor).任务有名称(taskName),并且可以执行(execute). 而执行器与具体任务所执行的内容无关,只是回调(callback)任务的执行

[转载]聊聊Greenplum的那些事

原文   http://dbaplus.cn/news-21-341-1.html 聊聊Greenplum的那些事 李巍 2016-04-01 14:15:00 1024   开卷有益--作者的话    有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨.   笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum 早期员工加入Greenplum团队(当时的工牌是"005",哈哈),记得当时看了一眼Gree

75篇关于Tomcat源码和机制的文章

整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群) Tomcat集群的failover机制 Tomcat集群应用部署的实现机制 Tomcat集群机制剖析及其生产部署选型 Tomcat如何实现WebSocket Tomcat如何实现Comet Tomcat怎么实现异步Servlet To

Gitlab-ci与RUNNER的安装与使用

安装GitLab-CI 这个不用安装了,装好GitLab8.0及以上就自带了   GitLab-Runner的安装与使用 我的操作系统是:Centos 7.0 64位 安装gitlab-ci-multi-runner 添加yum源 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash 安装 yum install gitlab

java eventbus-guava.jar包 运行错误

问题描述 guava.jar包 运行错误 想在项目里使用eventbus,然后使用了google的guava包,编译的时候通过,运行的时候报如下错误: (能保证包已导入,且没有相互冲突的包) java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorServi

雾里看花之 Python Asyncio

从 Twisted 框架借鉴一些经验来理解 asynio 并非难事,但是,asyncio 包含众多的元素,我开始动摇,不知道如何将这些孤立的零碎拼图组合成一副完整的图画.我已没有足够的智力提出任何更好的建议,在这里,只想分享我的困惑,求大神指点. 原语 asyncio 通过协程coroutines 的帮助来实现异步 IO.最初它是通过 yield 和 yield from 表达式实现的一个库,因为 Python 语言本身演进的缘故,现在它已经变成一个更复杂的怪兽.所以,为了在同一个频道讨论下去,

英特尔开源分布式深度学习库BigDL:支持高性能大数据分析

近日,英特尔开源了一个运行在 Apache Spark 上的分布式深度学习库 BigDL,其可以利用已有的 Spark 集群来运行深度学习计算,并且还能简化从 Hadoop 的大数据集的数据加载. 开源地址>>> 据介绍,在 Xeon 服务器上的测试表明,BigDL 相比于 Caffe.Torch 或 TensorFlow 等开源框架实现了显著的速度提升.其速度可与主流的 GPU 相媲美,而且 BigDL 也能扩展到多达数十个 Xeon 服务器. BigDL 库支持 Spark 1.5.

java使用Executor(执行器)管理线程

v一.一个实现了Runnable接口的类 class MyThread implements Runnable{ private static int num = 0; @Override public void run() { while(true){ synchronized(MyThread.class){ ++num; try{ Thread.sleep(500); } catch(Exception e){ System.out.println(e.toString()); } Sys

Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式

最近负责一个框架性项目的升级,主要是从.NET Framework 3.0建议到.NET .NET Framework 3.5,开发工具也从VS2005迁移到VS2008.但是最让我头疼的是,原来Team Foundation Server 2005不能正常工作,公司暂时还没有购买VSTS 2008的打算.基于TFS 2005的Team Build功能不能使用了,导致原本通过Team Build实现的功能需要手工来做,涉及到的包括:Source Code的编译.文档的生成.VS项目类型的模板的创