常州高端网站建设公司,广西新闻,申请域名费用和服务费用,上海公司名称注册查询网我在一个Spring Boot项目中#xff0c;采用定时器执行一些操作#xff0c;比如10秒就发送一次数据。这些操作有2个#xff0c;如下所示。我就想#xff0c;虽然这两个操作各自指定了时间频率#xff0c;但如果其中一个操作非常耗时#xff0c;会不会影响其他操作呢#…我在一个Spring Boot项目中采用定时器执行一些操作比如10秒就发送一次数据。这些操作有2个如下所示。我就想虽然这两个操作各自指定了时间频率但如果其中一个操作非常耗时会不会影响其他操作呢
答案是会。
Service
public class ShareDataBySend {AutowiredSendDataService sendDataService;//操作1Scheduled(fixedRateString ${sff.interval}) // 每 * 秒执行一次private void send() {sendDataService.sendThem();}//操作2Scheduled(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 个任务可以并发执行。*/Overridepublic 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前者给出的方案不仅繁琐而且有错误。这或许不是模型的问题而是模型训练的材料有问题。也就是说也许中文世界中编程问题的答案质量与老外相比不在一个档次内。