SpringBoot项目如何使用多线程执行定时任务
SpringBoot使用多线程执行定时任务
我在一个Spring Boot项目中,采用定时器执行一些操作,比如10秒就发送一次数据。
这些操作有2个,如下所示。
我就想,虽然这两个操作各自指定了时间频率,但如果其中一个操作非常耗时,会不会影响其他操作呢?
答案是会。
@Service
public class ShareDataBySend {
@Autowired
SendDataService sendDataService;
//操作1
@Scheduled(fixedRateString = "${sff.interval}") // 每 * 秒执行一次
private void send() {
sendDataService.sendThem();
}
//操作2
@Scheduled(fixedRateString = "${sff.interval}") // 每 * 秒执行一次
private void send2() {
sendDataService.sendNce();
}
}怎么办呢?AI告诉我,引入多线程。
引入多线程
上面代码中,使用了注解@Scheduled。这个注解告诉 Spring ,它需要定期执行标注的方法。@Scheduled依赖于 Spring 的任务调度机制,默认使用一个单线程的任务调度器执行任务。如果没有显式地配置线程池,所有的定时任务都会在同一个线程中按顺序执行。然而,当我们配置一个线程池任务调度器时,Spring 会自动使用这个调度器,这样每个定时任务(如 send() 和 send2())就会在不同的线程中并发执行。
也就是说,我们不需要修改上面这个ShareDataBySend类,而是新注册一个线程池任务调度器,系统就会自动改用多线程。这一切,都源自于Spring Boot框架的本身机制。
代码示例
1、新增线程池任务调度器配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
/**
* 我们将默认的单线程调度器替换成了 ThreadPoolTaskScheduler,并设置了线程池大小(例如 10)。
* 这意味着多达 10 个任务可以并发执行。
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10); // 设置线程池大小,可根据需要调整
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}在系统启动的时候,Spring Boot会将带有@Config注解的类型实例化到容器中,因此SchedulerConfig 配置的 ThreadPoolTaskScheduler 被初始化。
当定时任务触发时(根据 @Scheduled 的定义),任务被提交给 ThreadPoolTaskScheduler 处理。
如果有多个任务,它们会被分配到线程池中的不同线程上执行,从而实现并发。
2、原ShareDataBySend类
不需要作任何修改
总结
我用java也有好几年了。其实一直都是在用Spring Boot。Spring Boot是一个java开发框架,但我感觉Spring Boot已经足够优秀和方便,对于我来说,Spring Boot == Java。当然了,本质上,Spring Boot可以算是J2EE的一个流派,但青出于蓝。
另外,我就相同的问题,分别问通义千问和chatGPT,前者给出的方案不仅繁琐,而且有错误。这或许不是模型的问题,而是模型训练的材料有问题。也就是说,也许中文世界中,编程问题的答案质量,与老外相比,不在一个档次内。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Spring Security怎么从数据库加载我们的用户
这篇文章主要为大家介绍了Spring Security怎么从数据库加载我们的用户示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-01-01
Springboot项目打包如何将依赖的jar包输出到指定目录
公司要对springboot项目依赖的jar包进行升级,但是遇到一个问题,项目打包之后,没办法看到他里面依赖的jar包,版本到底是不是升上去了,没办法看到,下面通过本文给大家分享Springboot项目打包如何将依赖的jar包输出到指定目录,感兴趣的朋友一起看看吧2024-05-05
单台Spring Cloud Eureka升级到三台Eureka高可用集群
今天小编就为大家分享一篇关于单台Spring Cloud Eureka升级到三台Eureka高可用集群,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12
java synchronized同步静态方法和同步非静态方法的异同
这篇文章主要介绍了java synchronized同步静态方法和同步非静态方法的异同的相关资料,需要的朋友可以参考下2017-01-01
如何使用Spring Boot ApplicationRunner解析命令行中的参数
这篇文章主要介绍了使用Spring Boot ApplicationRunner解析命令行中的参数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2018-12-12


最新评论