前言

之前有测试

# 启动类加
@EnableAsync
# 方法上加注解
@Async
@PostConstruct

但是依旧会卡主主线程,所有另辟蹊径

第一种

在启动类上加注解

@EnableAsync

新建一个类

实现 ApplicationRunner 并重写 run

因为我们是死循环,所以在 run 方法上额外加一个 @Async 注解即可

例如如下

package com.ruoyi.project.init;

import com.ruoyi.common.utils.MyUtils;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async; import javax.annotation.PostConstruct; @Configuration
public class HandleTransInit implements ApplicationRunner {
/**
* 处理转账数据
*
* @param args
*/
@Override
@Async
public void run(ApplicationArguments args) {
while (true) {
System.out.println("执行");
MyUtils.sleep(1000);
}
}
}

第二种

新建一个类

在类上加注解@Configuration

新建方法,在方法上加注解@PostConstruct

例如代码如下

package com.ruoyi.project.init;

import com.ruoyi.common.utils.MyUtils;
import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; @Configuration
public class HandleTransInit11 {
/**
* 处理转账数据
*/
@PostConstruct
public void run() {
//因为我是死循环这个简单的需求,所以线程池容量我就填写1了,如果你有其他需求,可以填大点,然后 scheduleAtFixedRate 方法复制多一点就行了
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1); // 下面用的是scheduleAtFixedRate,还有一种是scheduleWithFixedDelay
// 区别
// scheduleAtFixedRate:如果上一个任务的执行时间大于周期时间(period参数),任务结束后,下一个任务马上执行
// scheduleWithFixedDelay:如果上个任务的执行时间大于周期时间(period参数),任务结束后也会等待周期相应的时间才执行下一个任务
// 不管是scheduleAtFixedRate还是scheduleWithFixedDelay,他们都会等待上一个任务运行结束再进行下一个任务,而不是并发执行
scheduledThreadPoolExecutor.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//System.out.println(Thread.currentThread().getName());
System.out.println("开始" + LocalDateTime.now());
MyUtils.sleep(500);
System.out.println("完成" + LocalDateTime.now());
}
}, 1, 2, TimeUnit.SECONDS);
// 说一下3个参数的含义,
// 第一个参数,要执行的run方法,
// 第二个参数,initialDelay,首次执行等待多久后开始执行,就是容器启动后等待多久后才执行
// 第三个参数,period,周期,首次执行完后,以后每次执行间隔多久执行
// 这里写的period参数为2代表每2秒执行一次
// 如果run方法里的执行时间超过了2秒,那么run方法里执行完后,会立马执行,而不会再次等待2秒
// 如果run方法里的执行时间没有超过2秒,例如用时500毫秒,那么将会延迟1.5秒后继续执行run方法(周期 - run方法耗时 = 1.5秒)
}
}

几种简单的springboot启动后启动一条死循环线程方式的更多相关文章

  1. springboot启动后执行一段代码的方式

    文章转载自: https://www.cnblogs.com/zuidongfeng/p/9926471.html https://blog.csdn.net/zknxx/article/detail ...

  2. 一个JVM进程启动后里面有几个线程

    在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序.但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程 ...

  3. springboot 学习之路 9 (项目启动后就执行特定方法)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  4. web容器启动后自动执行程序的几种方式比较

    1.       背景 1.1.       背景介绍 在web项目中我们有时会遇到这种需求,在web项目启动后需要开启线程去完成一些重要的工作,例如:往数据库中初始化一些数据,开启线程,初始化消息队 ...

  5. Springboot 项目启动后执行某些自定义代码

    Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...

  6. 【Spring容器】项目启动后初始化数据的两种实践方案

    早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...

  7. SpringBoot启动后自动打开浏览器访问项目

    之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...

  8. Springboot项目启动后自动创建多表关联的数据库与表的方案

    文/朱季谦 在一些项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据 ...

  9. SpringBoot项目启动后再请求远程接口的实现方式

    场景 有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景. 解决 一般会有两种实现方 ...

  10. Springboot项目启动后访问不到Controller

    1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...

随机推荐

  1. 痞子衡嵌入式:了解主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制. 在痞子衡旧文 <RT四位数Boot模式> 里的 1.2 ...

  2. k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused

    前言 在搭建好 kubernetes 环境后,master 节点拥有 control-plane 权限,可以正常使用 kubectl. 但其他 node 节点无法使用 kubectl 命令,即使同步过 ...

  3. Xshell连接VMware虚拟机中的CentOS

    步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式.(由于只在本机进行连接,所以没有选择桥接模式.当然,桥接模式的配置会有所不同,在此不做深入分析) 2. 在VMware works ...

  4. 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案

    AI教父辛顿说DeepSeek允许本地部署的话可能会导致用户用DeepSeek来做一些危险的事情(https://t.cj.sina.com.cn/articles/view/7879923924/m ...

  5. IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

    日前,IvorySQL 4.0 重磅发布,全面支持 PostgreSQL 17,并且增强了对 Oracle 的兼容性.关于 IvorySQL 4.0 的介绍,各位小伙伴可以通过这篇文章回顾:Ivory ...

  6. 必看!SpringAI轻松构建MCP Client-Server架构

    MCP 这个概念相信大家已经听了无数次了,但不同人会有不同的解释,你可能也是听得云里雾里的. 不过没关系,今天这篇内容会通过 Spring AI 给你实现一个 MCP 的 Client 和 Serve ...

  7. 【Git】国内的项目托管网站-码云

    国内的项目托管网站-码云 1 简介 使用 GitHub 作为项目托管网站如果网速不好很影响效率,大家也可以使用国内的项目托管网站-码云.网址是 https://gitee.com/ ,使用方式跟 Gi ...

  8. 1001: 【编程入门】A+B 输入输出练习I

    1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...

  9. 从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画

    QGraphicsItem 有3种方式进行变换:1. 最简单方便的是使用 setRotation() .setScale():2. 使用 setTransform() 进行复杂变换:3. 还可以使用 ...

  10. 树状数组(Fenwick Tree)原理和优化全面解析

    你正在开发一个交易系统,需要实时完成两种操作: 更新某个时间点的价格(单点修改) 快速计算某段时间段内的交易总量(区间查询) 当数据量较小时,我们可能会这样实现: vector<int> ...