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

     举例:

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/shen-qian/p/11459818.html
Copyright © 2011-2022 走看看