美文网首页Springboot
SpringSchedual多线程执行

SpringSchedual多线程执行

作者: 8813d76fee36 | 来源:发表于2018-09-11 16:50 被阅读100次

前言

Spring提供了定时任务的实现。以SpringBoot为例,在主运行类上添加@EnableScheduling注解即可开启对定时任务的支持。同时,在定时任务方法上配合@Scheduled注解来实现执行计划的配置。

需要注意的是,默认情况下,Spring只会为定时任务分配一个线程。因此,多个定时任务是在单线程中顺序执行的,也就是说,任务A尚未执行完毕时,排在其后的任务B需要等待任务A结束后才能执行。

问题分析

现在我们通过源码来验证上述的说法,看看Spring是怎么为定时任务分配的线程。
现在我们定位到org.springframework.scheduling.config.ScheduledTaskRegistrar类,该类有个scheduleTasks()方法,该方法的第一个if判断表明,当taskSchedulernull时,会创建一个单线程线程池。

scheduleTasks()

问题解决

通过查看源码可知,我们需要为taskScheduler指定一个多线程的线程池,
才能达到多线程执行定时任务的效果。

方法如下:

  • 创建一个配置类,实现org.springframework.scheduling.annotation.SchedulingConfigurer接口
  • 重写configureTasks()方法
    该方法将ScheduledTaskRegistrar实例作为参数传入,该实例的类正是我们刚才分析scheduleTasks()方法时出现的类。
  • 调用ScheduledTaskRegistrar.setScheduler()方法,为它指定一个线程池。
定时任务配置
@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}

相关文章

  • SpringSchedual多线程执行

    前言 Spring提供了定时任务的实现。以SpringBoot为例,在主运行类上添加@EnableScheduli...

  • GCD的使用,同步和异步,串行和并行

    多线程并发(同时)执行,其实就是CPU快速地在多线程之间的快速调度,就会造成多线程并发执行的假象;多线程下,不要相...

  • Java 多线程(一):多线程基础详解

    多线程概述 多线程是指一个进程(执行中的程序)同时运行多个线程(进程中负责程序执行的执行单元),多线程可以协作完成...

  • iOS - 多线程NSThread的使用

    一、多线程的基本概念: 1. 多线程的原理: 多线程是循环切换执行的 线程执行完毕之后会自动销毁 2. 多线程的优...

  • 浅谈iOS中多线程开发

    目录: (一)线程与进程之间的区别 (二)为什么需要学习多线程 (三)多线程任务执行方式 (四)多线程执行的...

  • Kotlin:该如何实现多线程同步?

    问题背景需执行多线程任务:任务1、任务2并行执行;等全部执行完成后,执行任务3。 实现方式「多线程同步」。Kotl...

  • 多线程及网络编程

    多线程1.多线程的概述: 进程有多条执行路径,合称为多线程.进程:可执行文件(程序).eg:exe文件线程:进程的...

  • 问题:什么是多线程

    多线程 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务多线程技术可以提高程序的执行效率 多线程...

  • CountDownLatch的应用

    使用场景,在多线程执行完成后根据多线程执行返回值继续后续操作。代码如下 执行结果:pool-1-thread-1:...

  • 锁与多线程同步的实现

    Java当中的锁都是为了保证多线程同步执行。如果没有锁的话,多线程是异步执行的。 什么是多线程同步? 请看下面的代...

网友评论

    本文标题:SpringSchedual多线程执行

    本文链接:https://www.haomeiwen.com/subject/zqvugftx.html