当前位置: 代码网 > it编程>编程语言>Java > SpringBoot项目如何使用多线程执行定时任务

SpringBoot项目如何使用多线程执行定时任务

2025年01月15日 Java 我要评论
springboot使用多线程执行定时任务我在一个spring boot项目中,采用定时器执行一些操作,比如10秒就发送一次数据。这些操作有2个,如下所示。我就想,虽然这两个操作各自指定了时间频率,但

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com