Web服務停止並卸載後其啓動的線程還在跑的可能原因

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!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章