几种简单的springboot启动后启动一条死循环线程方式
前言
之前有测试
# 启动类加
@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启动后启动一条死循环线程方式的更多相关文章
- springboot启动后执行一段代码的方式
文章转载自: https://www.cnblogs.com/zuidongfeng/p/9926471.html https://blog.csdn.net/zknxx/article/detail ...
- 一个JVM进程启动后里面有几个线程
在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序.但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程 ...
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- web容器启动后自动执行程序的几种方式比较
1. 背景 1.1. 背景介绍 在web项目中我们有时会遇到这种需求,在web项目启动后需要开启线程去完成一些重要的工作,例如:往数据库中初始化一些数据,开启线程,初始化消息队 ...
- Springboot 项目启动后执行某些自定义代码
Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...
- 【Spring容器】项目启动后初始化数据的两种实践方案
早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...
- SpringBoot启动后自动打开浏览器访问项目
之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...
- Springboot项目启动后自动创建多表关联的数据库与表的方案
文/朱季谦 在一些项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据 ...
- SpringBoot项目启动后再请求远程接口的实现方式
场景 有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景. 解决 一般会有两种实现方 ...
- Springboot项目启动后访问不到Controller
1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...
随机推荐
- 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
昨天DD以为阿里开源的QwQ-32B会刷爆全网,毕竟对标的是上一个热门项目deepseek-r1.但是,万万没想到,获得更多关注的居然是:Manus. 简单的从网上介绍信息了解了一下,感觉跟OpenA ...
- 线上测试木舟物联网平台之如何通过HTTP网络组件接入设备
一.概述 木舟 (Kayak) 是什么? 木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台.支持异步和响应式编程开发,功能包含了物模 ...
- Caddy web服务器
caddy 中文文档:https://caddy2.dengxiaolong.com/docs/ 常用命令 命令 描述 caddy run 启动Caddy服务器 caddy reload 重载Cadd ...
- 基于pandas的数据清洗 -- 缺失值(空值)的清洗
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- oracle数据库体系架构详解
在学习oracle中,体系结构是重中之重,一开始从宏观上掌握它的物理组成.文件组成和各种文件组成.掌握的越深入越好.在实际工作遇到疑难问题,其实都可以归结到体系结构中来解释.体系结构是对一个系统的框架 ...
- Visual Studio 外部工具中添加 git-bash
引言 旧版的 Visual Studio 没有集成 git 工具,并且自己也习惯用 git-bash 命令行来操作, 那么如何在旧版的 Visual Studio 快速打开 git-bash 终端呢? ...
- android中大咖:TlistView
d的android中的Tlistview相当于cxGrid,其开发使用中的主咖地位至高无上. 可是如何高效使用快速实现的需求呢?需要的话补官方的教程 上图: GOODLUCK!
- Anonymous打靶学习笔记(5)
参考视频https://www.bilibili.com/video/BV1XufaYAEKc/?spm_id_from=333.1387.search.video_card.click 常见的100 ...
- TCP延迟调优之PSH参数与passt延迟问题修复
qemu中使用passt来作为虚拟机的网卡NAT实现,希望能够利用它IP地址与host一致的优点.这本来是没有啥问题的,但是不知道为什么它的TCP入口流量的延迟很严重. 好吧,反正以后总是要改pass ...
- Robot Framework全局变量集合取值
在一次测试中,可能需要使用多个不同的会员,即需要多注册多个会员.如此配置单一参数化是无法满足对所有注册会员名的统一管理,这里引入参数变量组来实现 步骤如下: 1.脚本目录点击总目录,右键点击New R ...