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");     } }


(2)通过浏览器访问 /hello 接口,可以看到控制台输出如下:

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



上一篇:Executors提供的四种线程池


下一篇:如何在Java中查找非常大的文件复制状态