当前位置: 首页 > article >正文

Spring Boot项目使用多线程执行定时任务

我在一个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,前者给出的方案不仅繁琐,而且有错误。这或许不是模型的问题,而是模型训练的材料有问题。也就是说,也许中文世界中,编程问题的答案质量,与老外相比,不在一个档次内。


http://www.kler.cn/news/342345.html

相关文章:

  • Excel多级结构转成树结构形式
  • 基于vue的酒店预订管理系统(源码+定制+开发)
  • 苹果秋季盛典:iPhone 16系列引领未来科技潮流
  • 数据库——表格之间的关系(表格之间的连接和处理)
  • 数据仓库!企业决策的智慧引擎
  • hadoop入门
  • 陪护小程序|护理陪护系统|陪护小程序成品
  • Spring Boot洗衣店订单系统:提升运营效率
  • 基于IMX6UL的EPIT的定时器实验
  • byte[]/InputStream/MultipartFile之间进行转换
  • Redis 高可用方案
  • 《Electron 基础知识》设置 Vue 中引用的文件路径别名
  • 便民医疗服务小程序后端springboot 服务 vue3 开发的后端 系统设计与实现
  • springmvc直接访问 上下文路径 302 后路径更改并跳转源码解析
  • 【系统架构设计师】案例专题三:数据库系统考点梳理
  • 图像分割恢复方法
  • AI智能体:共塑企业变革新纪元,引领未来无限潜能
  • Hessian 序列化
  • Java面试题——第十篇
  • Midjourney中文版:解锁你的创意之旅