zoukankan      html  css  js  c++  java
  • springboot--异步执行的方法及定时执行的方法

    让方法被调用后异步的执行

            一般来说,要异步执行一个任务都是创建一个线程来专门干这个任务。在springboot中有 @Async 这个注解快速实现方法的异步执行。只需要两步:第一步: 在启动类上加上@EnableAsync注解,表示这个程序支持异步的方法。如下:

    @EnableAsync
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }

    第二步:在service层的类的方法上写上@Async注解,表示这个方法是异步执行的。如下:

    @Service
    public class MyService {
        @Async
        public void doA() {
            //doSomething
        }
    }

    这样,doA()方法被外部调用后就是异步执行的了。

    注意:1. 要想使被调用的方法确实是异步的执行,必须是外部调用,在本类的内部其他方法调用此方法仍然是同步的。也因此,异步方法必须是public修饰。

               2.关于返回值: 由于是异步执行方法,这个方法被调用后因此我们也无法知道它什么时候执行完毕。因此在异步方法前加上返回值是会出问题的。例如:

    @Service
    public class MyService {
        @Async
        public Integer doA() {
            //doSomething
            return 1;
        }
    }
    --------------------------------------
    public class Test {
        public static void main(String[] args) {
            MyService ms = new MyService();
            System.out.println(ms.doA());    //尝试调用异步方法 doA 获得返回值,并输出
        }
    }

    这样是不能正常获得doA()方法的返回值的,因为在我们输出doA()的返回值时,doA()甚至可能一行代码都没执行完毕。

    所以如果异步方法不是void返回类型,为其他返回类型时被调用一律直接返回 null,如果返回类型是基本数据类型由于返回的是 null 则可能抛出装箱异常。

    如果确实需要获取异步方法的返回值,则需要使用Future类:

    @Service
    public class MyService {
        @Async
        public Future<Integer> doA() {       //使用Future类接收返回值
            //doSomething
            return 1;
        }
    }

    Future类的具体用法这里不讲。

    让方法定时的执行

           要将一个方法变为定时执行,步骤与上面一样,首先在启动类上加注解 @EnableScheduling,然后在具体的方法上加上 @Scheduled 注解即可。要使用@Scheduled注解完成目标,主要是要熟练使用注解的参数。

           

    (图片来源于葛香东视频课 《springboot 编写restful api》)

     cron是按指定时钟定时执行,一般需要搭配zone指定时区。

    其他三个参数则是方法按指定频率或间隔执行。

    cron是一个字符串,用来表示定时执行的具体规则。从左至右分别为 “秒 分 时 日 月 星期几 年” 年可为空 ,表示任意年。

     举例:

  • 相关阅读:
    vue学习03 v-html
    [spring guides]网关入门
    记一次公司mssql server密码频繁被改的事件
    重构 maixpy 的 board_info + config.json 从而自适应硬件版型。
    介绍 MaixUI 系列(一)如何食用?
    (旧文)在 micropython / esp-at / arduino 中实现 软串口(software-serial) 的参考
    以优化 MaixPy 的启动速度为例,说说 K210 的双核使用及原子操作。
    我是如何在 Win + VSCode 上开发 Keil for GD32 实现 I2C 从机的游戏机手柄。
    为 MaixPy 加入软 SPI 接口(移植 MicroPython 的 SPI)
    为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)
  • 原文地址:https://www.cnblogs.com/shen-qian/p/11459818.html
Copyright © 2011-2022 走看看