首页 > 其他分享 >SpringBoot是如何保证服务启动后不自动停止的

SpringBoot是如何保证服务启动后不自动停止的

时间:2023-11-09 18:22:24浏览次数:32  
标签:SpringBoot Thread 自动 停止 void isDead public sleep Springboot

一般项目执行后,当程序结束会自动关闭程序。但Springboot项目,启动后,只要不发生error错误,一般不会自动停止。

这是为什么呢?

简单Java阻止停止

为了保证一个服务能够持续有效地对外提供服务,一般会有相应的处理方式,比如:

  • 服务器上的守护进程脚本

但是,在Java代码层面,除了shell脚本之外,还有一种很特别的方式,保证服务不会执行后停止。

  • 死循环!文雅点叫自旋锁。

比如下面的例子:

public class ThreadDemo2 {
    public static volatile boolean isDead = false;
    public static void main(String[] args) throws InterruptedException {
        while (!isDead){
            Thread.sleep(4000);
        }
    }
}

程序执行后,会进入自旋锁的代码逻辑中,每隔4s,检查一下isDead值。

如果isDead一直为false,那么程序将不会自动停止。

但是,设置在主线程中,此处自旋锁触发后,导致后续代码并不会继续执行,影响到后面的逻辑处理,显然是不可取的。

如果,单独开辟一个新的线程,去处理这个活,主线程依旧去执行别的逻辑呢?

public class TestThread {
    public static volatile boolean isDead = false;

    public static void main(String[] args) throws InterruptedException {
        //        Thread thread = new Thread(new Runnable() {
        //            @Override
        //            public void run() {
        //                System.out.println("---------");
        //                try {
        //                    while (!isDead){
        //                        Thread.sleep(10000L);
        //                    }
        //                } catch (InterruptedException e) {
        //                    e.printStackTrace();
        //                }
        //            }
        //        });

        Thread thread = new Thread("container-1") {

            @Override
            public void run() {
                System.out.println("---------");
                try {
                    while (!isDead) {
                        Thread.sleep(4000L);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        };
        thread.setDaemon(false);

        thread.start();

        // 主线程暂停40s
        Thread.sleep(40000L);
        // 变更状态
        isDead = true;
    }
}

单独设定一个非守护进程的线程,去干这个活,主线程依旧可以继续执行其他的事。

基于这个思想,接下来看看源码中Springboot底层是如何实现的。

Springboot 底层实现

以Springboot默认整合Tomcat为例。

查看SpringApplication.run

Springboot的项目执行,依据的是run方法,其中的实现方式如下:

 

标签:SpringBoot,Thread,自动,停止,void,isDead,public,sleep,Springboot
From: https://www.cnblogs.com/xfeiyun/p/17816538.html

相关文章

  • Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法五)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。上一篇文章中,我们已经看到了四种解决办法了,这一篇文章我们一起来看看另外一种方法。二、实现过程这里【论草莓如何成为冻干莓】给了unstack()操作的方法,代......
  • 强无敌!一个项目涵盖SpringBoot集成各种场景
    大家好,我是Java陈序员。我们都知道,作为Java后端开发肯定绕不开Spring,而SpringBoot的横空出世更是帮助我们开发者可以快速迭代一个项目!SpringBoot之所以强大,是因为支持自动化配置,可以快速装配组件,如持久化框架缓存消息队列日志等等。今天给大家介绍一个SpringBoot集成各种......
  • 亚马逊云科技如何完善自动机器人及大语言模型的问答回复准确度
     概述 客户联络中心在现代是构成一个完整企业的重要组成部分,作为企业与顾客的连接纽带,在销售、服务支持以及提升顾客满意度方面发挥着至关重要的作用。使用亚马逊云科技AmazonConnect出海企业可以快速搭建自己的全球客服联络中心。当前客服联络中心也面临诸多的挑战,如长时间的电......
  • # yyds干货盘点 # Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。上一篇文章中,我们已经看到了四种解决办法了,这一篇文章我们一起来看看另外一种方法。二、实现过程这里【论草莓如何成为冻干莓】给了unstack()操作的方法,代码如下......
  • Android 系统自动安装app
      #!/system/bin/shinit_dev(){#initworkchmod666/dev/dgard0chmod666/dev/ttyS0chmod666/dev/ttyS5chmod666/dev/ttyS7chmod666/dev/tamper0chmod666/dev/magnetometer0chmod666/dev/doorbutton0chmod......
  • 第一次将Springboot项目上传到GitLab仓库(初始化)
    步骤:1、在GitLab上创建项目仓库(创建空项目)   创建完成如下: 2、在IDEA中新建一个Springboot项目 使用Git版本集成这里说明一下:1、本机计算机已经安装Git2、IDEA已经集成了Git3、这里使用的IDEA是2021版本(2018版本是VCS),IDEA中文......
  • docker run 容器启动后,想要新增端口映射和设置自动重启的方式
    关于新增自动重启(新版本docker支持,老版本不支持,请看第二种方式)一。要在已经运行的Docker容器中增加自动重启的选项,你可以使用dockerupdate命令来更新容器的配置。具体步骤如下:首先,使用dockerps命令列出所有正在运行的容器,并找到你想要设置自动重启的容器的CONTAINER......
  • Ansible自动化部署工具-组件及语法介绍
    大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成。避免出错,Ansible就是这方面非常好用的工具。它能将我们的安装软件,部署等过程进行代码编排,程序化我们的部署步骤。今天,我们就......
  • Xcode自动管理签名模式下更新PP文件
    1、Xcode切换到相应的Target,选择到Signing&Capabilities,找到ProvisioningProfileManagedProfile,旁边有一个Info符号,点击,展示PP文件详情,然后拖动左上角的PP文件图标到桌面,主要是为了获取该PP文件的名字。(如下图) 2、打开 ~/Library/MobileDevice/ProvisioningProfi......
  • Win10/11设置开机自动进入桌面
    按下「Win+R」,输入 netplwiz,打开用户账户面板;点击当前使用的用户名,去掉“要使用本计算机,用户必须输入用户名和密码”复选框;如果这一步没有复选框,需要进入到注册表修改:按下「Win+R」,输入 rgedit,打开注册表管理器;在注册表里找到这个路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsof......