zoukankan      html  css  js  c++  java
  • @Scheduled并行执行

    spring自带的任务调度是串行执行的,串行执行什么意思呢?
    就是第一个方法执行完成之后才会执行第二个方法.举个栗子:要是我两个方法都是每一秒执行一次,第一个方法执行时间比较长,那么第二个方法就不是每一秒执行了…但是不同类却是异步的.

    @Component
    public class Test{
     @Scheduled(cron = "0/1 * * * * ?")
        public void methodOne() {
      log.error("执行方法一...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Scheduled(cron = "0/1 * * * * ?")
        public void methodTwo() {
       log.error("执行方法二...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        }
    

    现在我想,方法一方法二同时执行,则叫做并行.要是我想方法一还在睡眠的时候,并不管他有没有执行完,直接执行下一次的话,那就是方法的异步执行了.参考https://blog.csdn.net/qq_38366063/article/details/87005949,使用@Async注解到对应的方法上即可.并行操作的配置类:

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.TaskScheduler;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    
    /**
     * 定时任务并行执行
     **/
    @Configuration
    @EnableScheduling
    @Slf4j
    public class ScheduledConfig implements SchedulingConfigurer {
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            TaskScheduler scheduler = this.taskScheduler();
            scheduledTaskRegistrar.setTaskScheduler(scheduler);
        }
    
        @Bean(destroyMethod = "shutdown")
        public ThreadPoolTaskScheduler taskScheduler() {
            ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
            scheduler.setPoolSize(10);
            scheduler.setThreadNamePrefix("task-");
            scheduler.setAwaitTerminationSeconds(60);
            scheduler.setWaitForTasksToCompleteOnShutdown(true);
            return scheduler;
        }
    }
    

    在执行,发现方法一方法二同时执行的;将setPoolSize设置线程个数,如果设置为1,就代表是串行的,执行就会发现时间很长…一般看定时任务的量,来合理设置size.

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    JavaScript 的 Promise
    MacOS copy图标shell脚本
    ExtJS 修改load paging时的参数
    JSONP
    8种跨域解决方案
    Ext Store Proxy Ajax
    ExtJS 自定义组件
    MacOS Apache配置
    xshell 上传 下载文件
    shell 内网主机存活探测器
  • 原文地址:https://www.cnblogs.com/javayida/p/13347068.html
Copyright © 2011-2022 走看看