原创

Java-定时任务-Scheduled单线程改成多线程

2022-07-15 12:23:30.002 [pool-9-thread-4] DEBUG cn.jiangjiesheng.edu.mapper.attachment.AttachmentMapper.selectByExample.debug:159 - ==> Parameters: 1(Integer), 1(Integer), 2(Integer), 3(Integer)

2022-07-15 12:23:30.004 [pool-9-thread-4] DEBUG cn.jiangjiesheng.edu.mapper.attachment.AttachmentMapper.selectByExample.debug:159 - <== Total: 0

改成多线程
方案1:
@Configuration
public class ScheduledConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
方案2:
# 线程池大小 spring.task.scheduling.pool.size=5 # 线程名前缀 spring.task.scheduling.thread-name-prefix=myScheduling-

依赖定时任务的业务任务出现延迟:
方案1: 业务改成异步触发,不通过定时任务
方案2:定时任务改成多线程,有定时任务时间先后顺序的,改成嵌套调用,不同的任务使用try catch.
方案3:全表改增量、近期变量扫描


/**
特别注意 where没有过滤出不需要的数据,同时定时任务间隔果断1秒,导致线程资源阻塞、
*/
@Scheduled(cron = "0/10 * * * * ? *")
public void handlingToBeTranscodingFileAll() throws Exception {
attachmentService.handlingToBeTranscodingFileAll();
}
注意 线程名 [scheduling-1] 变成 pool-9-thread-4
查询未转码的文件sql where条件上没有过滤出不需要的数据,导致返回了大量数据,同时定时任务间隔过短,另外定时任务默认是单线程,导致线程始终在这里消耗,影响定时任务的处理。解决方案:where跟上更精确的条件,定时任务时间间隔扩大(后期可以改成实时,定时任务仅仅补偿数据),定时任务实例改成多线程。

之前学习进度偶尔不更新很可能也和这个有关系。
总结: 根据实际场景,减少无用执行逻辑,只需要更新部分的,禁止扩大更新范围(
另外定时任务是单线程的,单个定时任务如果间隔短,耗时长,就会始终占据单线程。
即便定时任务改造成多线程,如果多线程占用资源耗时大,也会导致无法执行,这就讲究代码的执行效率和减少无用功,禁止粗暴得全局类更新)

正文到此结束
本文目录