SpringBoot – 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例)

SpringBoot - 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例)
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说SpringBoot - 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例),希望能够帮助大家进步!!!

  有时我们的系统需要进行一些比较耗时的操作,比如用户注册后要调用邮件服务器给用户发送个邮件,又比如上传一个大数据量的 excel 并导入到数据库。如果后端的这些工作比较耗时,那么前台的页面便会一直处于等待状态,让用户会以为页面卡死了。

    通常这种比较耗时的操作应该做异步处理,也就是在后台进行,而用户可以不用等待。下面通过样例演示 Spring Boot 中如何执行异步任务。

 

1,开启线程池

    这里我们使用 java 线程池 ExecutorService,首先在项目中添加如下配置类,其作用在于 Spring 启动时自动加载一个 ExecutorService 对象。

1

2

3

4

5

6

7

8

@Configuration

public class ThreadPoolConfig {

 

    @Bean

    public ExecutorService executorService() {

        return Executors.newCachedThreadPool();

    }

}

 

2,创建异步任务

这里我们实现 Runnable 接口来创建一个异步任务,里面代码很简单,就是等待个 5 秒再结束:

注意:Runnable 和 Callable 在异步任务中的应用差别在于,一个不带返回值,一个带返回值而已。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class EmailRunnable implements Runnable {

    private String name;

 

    public EmailRunnable(String name) {

        this.name = name;

    }

 

    @Override

    public void run() {

        System.out.println("正在给" + name + "发送邮件......");

        try {

            Thread.sleep(5000);

        catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("邮件发送完毕");

    }

}

 

3,执行异步任务

(1)这里我们在一个 Cotroller 中通过线程池执行这个异步任务:

1

2

3

4

5

6

7

8

9

10

11

12

13

@RestController

public class HelloController {

 

    @Autowired

    ExecutorService executorService;

 

    @GetMapping("/hello")

    public void hello() {

        System.out.println("hello start");

        executorService.execute(new EmailRunnable("hangge"));

        System.out.println("hello end");

    }

}

原文出自:www.hangge.com  转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2720.html

本文来源huayang183,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/18201

发表评论