栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Scheduled并发执行多个任务配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Scheduled并发执行多个任务配置

@Scheduled并发执行多个任务配置
项目中定义多个定时任务

@Component
@Slf4j
public class DynamicTask {

    @Autowired
    private DynamicTestMapper dynamicTestMapper;

    @Scheduled(cron = "0 */1 * * * ?")
    public void test() {
        log.info("查询系统列表test");
        List> mapList = dynamicTestMapper.querySystemList();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("test数据大小:" + mapList.size());
    }

    @Scheduled(cron = "0 */1 * * * ?")
    public void test1() {
        log.info("查询系统列表test1");
        List> mapList = dynamicTestMapper.querySystemList();
        log.info("test1数据大小:" + mapList.size());
    }
}

从运行结果可以看到,两个定时任务是一个线程在执行,串行的。运行结果如下:

查看源码发现在项目启动的时候,ScheduledAnnotationBeanPostProcessor会执行finishRegistration方法,在spring容器中查找TaskScheduler和ScheduledExecutorService(java原生的)的bean,因为项目中未注入bean,这里获取的都是null值。

然后会执行ScheduledTaskRegistrar的scheduleTasks方法注册所有定时任务,在此方法内创建了一个newSingleThreadScheduledExecutor单线程的线程池,作为TaskScheduler的线程池。因此在执行定时任务的时候只有一个线程在串行化的执行所有任务。

因此,我们只需要自定义一个TaskScheduler,设置线程数即可。这里使用ThreadPoolTaskScheduler ,ThreadPoolTaskScheduler 的默认线程数也是1。

@Configuration
public class ScheduleConfig {

    private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2 + 1;

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(CORE_POOL_SIZE);
        return threadPoolTaskScheduler;
    }
}


重新启动程序,可以看到自定义的TaskScheduler已经注入,且线程数为13。

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490070.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号