您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

看Tomcat如何用CountDownLatch停止容器

时间:2020-11-23 13:23:35  来源:  作者:

背景

Tomcat 源码中多处用了JAVA.util.concurrent 包中的类,用以处理多线程环境下的流程控制。近日分析了下NioEndpoint 源码,本文将以此类为背景,膜拜下 Java 大神们使用 CountDownLatch 并发控制的手法,其实也就是简单的实际应用,算不上高深。

类图框架

NIO tailored thread pool, providing the following services:
Socket acceptor thread:Acceptor
Socket poller thread:Poller
Worker threads pool:Executor

以上是该类的注释,结合源码我们知道 NioEndpoint 就是一个定制线程池,管理了三种线程:Acceptor、Poller、Worker。
(百来的一张很清晰的结构图如下:)

看Tomcat如何用CountDownLatch停止容器

 

初始化

NioEndpoint 类维护了一个 stopLatch 的变量,其类型就是 CountDownLatch。它根据 Poller 线程的个数进行初始化的,源码如下:

public void bind() throws Exception {
	....
	if (acceptorThreadCount == 0) {
            // FIXME: Doesn't seem to work that well with multiple accept threads
            acceptorThreadCount = 1;
        }
        if (pollerThreadCount <= 0) {
            //minimum one poller thread
            pollerThreadCount = 1;
        }
        stopLatch = new CountDownLatch(pollerThreadCount);
	....
}

NioEndpont 类初始化时指定了 Poller 和 Accetpor 线程数,而且从上面代码的注释信息来看 acceptorThreadCount 的固定 是 1,即 Tomcat 的 NIO 并不支持多个 Accepor 线程,此外也没有可以修改该属性的途径。

stopLatch 控制流程

stopLatch,顾名思义,是控制 Tomcat 的组件停止时使用的锁,利用 CountDownLatch ,主线程等待一组线程到达某个状态后,才进行后面的处理。NioEndpoint 的 stopInternal() 方法的流程如下:

public void stopInternal() {
        releaseConnectionLatch();
        if (!paused) {
            pause();
        }
        if (running) {
            running = false;
            unlockAccept();
            for (int i=0; pollers!=null && i<pollers.length; i++) {
                if (pollers[i]==null) continue;
                pollers[i].destroy();
                pollers[i] = null;
            }
            try {
                stopLatch.await(selectorTimeout + 100, TimeUnit.MILLISECONDS);
            } catch (InterruptedException ignore) {
            }
            shutdownExecutor();
            eventCache.clear();
            nioChannels.clear();
            processorCache.clear();
        }
 }

该方法将导致所有的处理线程都停止工作,其流程为:

  1. 首先,通知Poller线程停止工作,调用其 destroy,设置 Poller 的 close 标识为 true。
  2. 其次,设置 running 为 false,通知 Acceptor 线程终止 run 方法的循环处理。
  3. 第三,当前线程 stopLatch.await ,等待所有的 Poller 线程的 run方法结束。Poller 的 run 方法最后一句是 stopLatch.countDown(),当 stopInternal 的 await 方法被唤醒时,说明所有的Poller 线程都结束了。
  4. 第四,此处调用 await 操作的超时时间设置为 selectorTimeout,这个值也是Poller处理时的阻塞时间,也就是说:如果Poller的在轮询过程中调用了selector.select(selectorTimeout);的话,最多等待这么长时间,就能保证所有的Poller都及时结束了。

此处,之所以不用考虑 Acceptor 的结束问题,是因为 Acceptor 线程只有一个,而且它没有阻塞处理,所以一旦 running 标识为 false,它就会立即结束。

所有的处理线程都结束之后,shutdownExecutor() 操作会关闭工作线程池的调度器,至此,所有的线程都被关闭了。

启示录

开发中,如何需要自定义线程池框架,就可以参照这个流程对线程池资源进行关闭,用 JUC 包中的并发工具类,比自己写同步计数器方便多了!Tomcat 教我们的这一招,你学会了吗?



Tags:Tomcat   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1. 整体架构简析#如果将Tomca它的结构高度抽象的话,那么Tomcat其实可以看成只是有连接器(Connector)和容器(Container)两个组件构成。其中Connector组件负责在服务器端处理客户端...【详细内容】
2021-09-30  Tags: Tomcat  点击:(53)  评论:(0)  加入收藏
开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 S...【详细内容】
2021-09-17  Tags: Tomcat  点击:(68)  评论:(0)  加入收藏
一、前言server.xml 配置,是 Tomcat启动配置,从配置结构可以看出 Tomcat 的整体架构。如果能够了解其常用配置项,对 Tomcat有一个高屋建瓴的把握,然后再庖丁解牛,一步步深入源码...【详细内容】
2021-07-04  Tags: Tomcat  点击:(86)  评论:(0)  加入收藏
一,undertow介绍 1,undertow简介:Undertow是RedHAT红帽公司开源的产品,采用java开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器。在javaw...【详细内容】
2021-05-07  Tags: Tomcat  点击:(184)  评论:(0)  加入收藏
说明最近项目上遇到一些https的问题,需要在tomcat里面测试一下如何开启https协议访问网站,在网上查了一些资料,自己也试了很多次,终于成功搞定了,下面跟大家分享一下我的一点经验...【详细内容】
2021-04-20  Tags: Tomcat  点击:(162)  评论:(0)  加入收藏
1 Jetty与glassfish的基本介绍1.1 研究背景及意义下图是对几个主流的应用服务器使用比率的粗率统计结果做出的一个饼图。这个图的数据也许不够精确,但它还是可以在一定程度上...【详细内容】
2021-04-06  Tags: Tomcat  点击:(199)  评论:(0)  加入收藏
Tomcat是什么?Tomcat是web容器。你在做web项目时,多数需要http协议,也就是基于请求和响应,比如你在百度输入一行内容搜索,那么百度服务器如何处理这个请求呢,他需要创建servlet来...【详细内容】
2021-03-24  Tags: Tomcat  点击:(290)  评论:(0)  加入收藏
有这样一个场景,公司为了安全起见,需要对所有登录Linux服务器做安全限制,要求除了管理员其他要登录linux服务器的员工不能用最高权限账号登录,要创建新的用户,对目录及文件权限做...【详细内容】
2021-03-04  Tags: Tomcat  点击:(178)  评论:(0)  加入收藏
热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在Web容器中启动一...【详细内容】
2021-03-03  Tags: Tomcat  点击:(210)  评论:(0)  加入收藏
制作tomcat镜像先找到一个要安装的版本我们这里以拉取tomcat8的官方镜像为例 1:拉取官方镜像docker pull tomcat:8 2:查看镜像并启动tomcat容器docker imagesdocker run -d -p...【详细内容】
2021-03-01  Tags: Tomcat  点击:(323)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(8)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条