首页 > 其他分享 >Web服务停止并卸载后其启动的线程还在跑的可能原因

Web服务停止并卸载后其启动的线程还在跑的可能原因

时间:2023-09-23 12:25:29浏览次数:36  
标签:Web 05 09 卸载 线程 23T12 2023 import

package org.example;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.time.LocalDateTime;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 使用注解模式配置Servlet的loadOnStartup时,需要同时设置了urlPatterns才能起作用,使用web.xml配置则不用
 *
 * @Author: xurm [email protected]
 * @Date: 2023-09-22
 * @Description:
 */
@WebServlet(loadOnStartup = 1, name = "timer", urlPatterns = "/")
public class TimerServlet extends HttpServlet {
    /**
     * 创建一个定时任务调度线程池
     */
    private ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1);

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println(LocalDateTime.now());
        }, 1000, 1000, TimeUnit.MILLISECONDS);
        System.out.println("\033[31m定时器初始化完成!\033[0m");
    }

    @Override
    public void destroy() {
        super.destroy();
        System.out.println("\033[35m卸载TimerServlet!\033[0m");
        //必须手动关闭线程池,否则因为通过Sevlet启动的线程的生命周期是Web服务器级别的(或者说是JVM级别),只是当前Web停止时线程依旧在跑的
        scheduledExecutorService.shutdown();
    }
}

以下是放如Tomcat里启动随后停止的效果:

23-Sep-2023 12:05:52.713 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用 程序部署到目录 [D:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\webDemo]
定时器初始化完成!
23-Sep-2023 12:05:52.735 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\webDemo]的部署已在[22]毫秒内完成
23-Sep-2023 12:05:52.746 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
23-Sep-2023 12:05:52.777 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 682 ms
2023-09-23T12:05:53.743001
2023-09-23T12:05:54.742991
2023-09-23T12:05:55.748843
2023-09-23T12:05:56.745415200
2023-09-23T12:05:57.755429
2023-09-23T12:05:58.746131200
2023-09-23T12:05:59.752523700
2023-09-23T12:06:00.748606100
2023-09-23T12:06:01.747062800
2023-09-23T12:06:02.750273900
卸载TimerServlet!

 

标签:Web,05,09,卸载,线程,23T12,2023,import
From: https://www.cnblogs.com/xuruiming/p/17724160.html

相关文章

  • 卸载 MySQL
    卸载MySQLsudosystemctlstopmysql #命令以停止MySQL服务sudoapt-getremove--purgemysql-servermysql-clientmysql-common #卸载MySQL及其依赖sudorm-rf/etc/mysql/ #删除MySQL的配置文件sudorm-rf/var/lib/mysql/ #删除MySQL的数据文件sudoapt-......
  • 深入探讨Spring WebFlux的函数式端点
    介绍SpringWebFlux是SpringFramework5中的新功能,它提供了一种基于反应式编程的Web框架。在WebFlux中,我们可以使用函数式端点来处理HTTP请求。这篇博客将深入探讨SpringWebFlux的函数式端点。函数式端点函数式端点是一种处理HTTP请求的方式,它使用函数来处理请求。在WebFlux中......
  • 【技术研究】线程环境块TEB
    今天继续看逆向工程核心原理,今天看到了TEB,这个部分之前看加密与解密的时候基本上就没看明白,这次打算把环境配置完备,全部都实践一次。首先看到的是TEB结构体TEB结构体成员里面的重要成员有两个_NT_TIBProcessEnvironmentalBlock第二个是个指向结构体的指针第一个是NT_......
  • SpringMVC如何在web.xml中配置DispatcherServlet
    SpringMVC如何在web.xml中配置DispatcherServlet配置WEB-INF/web.xml===>配置前端控制器/中央控制器/分发控制器,用户所有的请求都会经过它的处理<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi......
  • vapor 基于swift 的web 框架
    vapor是基于swift的web框架,包含了不少功能,官方也提供了不少扩展,同时官方提供的模版可以直接基于docker运行说明对于希望学习swift同时基于swift开发web应用的是一个不错的选择,可以学习练练手参考资料https://vapor.codes/https://github.com/vapor/vapor......
  • 进程与线程
    目录进程定义特点线程定义特点进程与线程的联系与区别联系区别扩展并行与并发相关参考开始前先看一组非常传神的图例,相信可以帮助你更好理解进程与线程的概念:进程定义什么是进程?进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是计算机中正在......
  • 假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时
    假设a是一个由线程1和线程2共享的初始值为0的全局变量,则线程1和线程2同时执行下面的代码,最终a的结果不可能是()booleanisOdd=false;for(inti=1;i<=2;++i){if(i%2==1)isOdd=true;elseisOdd=false;a+=i*(isOdd?1:-1);}A:-1B:-2C:0D:1......
  • nginx代理websocket请求原理 理解记录
    最近遇见一个问题,在OpenEuler操作系统上,如果不主动开放端口白名单的话,就无法访问该端口。然后我部署了一个服务,端口是5200。在这台机器上部署了一个nginx,通过nginx80端口反向代理5200端口。然后再OpenEuler上开放80端口。此时本地访问80端口,登录后正常的http请求都没问题。......
  • 基于事件的 JavaScript 编程:构建交互式 Web 应用程序
    了解事件 1.事件类型JavaScript支持多种事件类型。一些最常见的包括:鼠标事件:这些事件由用户与鼠标的交互触发,例如单击、悬停和拖动。键盘事件:这些事件在用户与键盘交互时发生,例如按下某个键或松开某个键。表单事件:与表单元素相关的事件,例如提交表单或更改输入字段的值。......
  • 05_webview操作和使用
      新建一个文件夹,跟之前一样,在Vscode终端里输入yarncreateelectron-appDrag。  首先也是按照之前的方法去创建js和js文件夹下的render.js。  在index.js中的webPreferences添加:  红框中的代码是html支持webview。webview其实是嵌入式一个网页,让我......