1。如果TaskScheduler中没有指定多线程,默认线程池中只有一个线程执行调度器,默认不能并发执行多个调度任务。2.单线程前提下,cron表达式相同,同一时刻只会执行一个调度器。调度程序按顺序执行。如果前面的调度器被阻塞/抛出异常,后面的调度器就无法执行。3.创建一个TaskScheduler实例并指定线程数。4.同一个任务是顺序执行的,只有本次执行完成后,才会执行下一次执行。1)输出的线程名表示只有一个线程存在。当一个线程被阻塞或者抛出异常时,后续调度器无法执行2)TaskScheduler中指定多个线程时,不会出现上述情况@ConfigurationpublicclassMyScheduled{@Scheduled(cron="0/5****?”)publicvoidfirst()throwsInterruptedException{System.out.println("当前时间:"+LocalDateTime.now()+"--first--"+"当前线程:"+Thread.currentThread().getName());//尝试{inti=1/0;线程.睡眠(2000);/*}catch(Exceptione){e.printStackTrace();}*/}@Scheduled(cron="0/5****?")publicvoidsecond(){System.out.println("当前时间:"+LocalDateTime.now()+"--second--"+"当前线程:"+Thread.currentThread().getName());尝试{Thread.sleep(2000);}catch(Exceptione){e.printStackTrace();}}@BeanpublicTaskSchedulertaskScheduler(){ThreadPoolTask??SchedulertaskScheduler=newThreadPoolTask??Scheduler();任务调度程序。设置池大小(10);返回任务调度程序;}}原理分析:1.查看@Scheduled源码只是一些注解的组合,并没有引入其他组件或方法,所以不用过多分析,通过查看方法调用栈,找到finishRegistration()并在springboot启动时打印日志,...---[main]o.s.s.c.ThreadPoolTask??Scheduler:InitializingExecutorService'taskScheduler'1)通过断点和源码分析,我们知道在springboot启动的过程中,会生成一个ThreadPoolTask??Scheduler实例放入容器中,其中poolSize=1.如果我们配置TaskScheduler,实例将被finishRegistration()方法覆盖和分析。首先,我们会去容器中找到SchedulingConfigurer的实例,我们可以自定义它。定义一个类实现SchedulingConfigurer接口,重写方法,指定TaskScheduler。如果接口没有实现,会根据类型在容器中查找TaskScheduler实例。如果超过一个,则根据(taskScheduler)名称查找。如果没有找到TaskScheduler类型的Bean,则根据ScheduledExecutorService类型查找,如果根据名字(taskScheduler)有多个查找,没有则使用Executors.newSingleThreadScheduledExecutor()创建一个只有一个线程的线程池代码基于springboot2.2.9的分析https://blog.csdn.net/a718515...
