有时我们的系统需要进行一些比较耗时的操作,比如用户注册后要调用邮件服务器给用户发送个邮件,又比如上传一个大数据量的 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

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

  1. ExecutorService线程池

    ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{ } 2.建立ExecutorService线程池 Execut ...

  2. Executors源码解读——创建ExecutorService线程池

    Executors源码解读--创建ExecutorService线程池 〇.[源码版本] jdk 1.8 一.线程池概述 二.线程池创建 三.Executors源码解读 newFixedThreadP ...

  3. java 线程池的使用_Java 使用线程池执行若干任务

    在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率.线程池包含了一系列的线程,并且可以管理这些线程.例如:创建线程,销毁线程等.本文将介绍如何使用Ja ...

  4. Android性能优化之使用线程池处理异步任务

    说到线程,我想大家都不陌生,因为在开发时候或多或少都会用到线程,而通常创建线程有两种方式: 1.继承Thread类 2.实现Runnable接口 虽说这两种方式都可以创建出一个线程,不过它们之间还是有 ...

  5. Java等线程池执行完所有任务后再执行主线程

    2019独角兽企业重金招聘Python工程师标准>>> 因为要定时往数据库插入上百万数据,插入完之后再修改另外一部分数据, 怎么在线程池执行完所有任务后再执行主线程呢 import ...

  6. 通俗易懂,常用线程池执行的-流程图

    转载自  通俗易懂,常用线程池执行的-流程图 有时候花了大把时间去看一些东西却看不懂,是很 " 蓝瘦 " 的,花时间也是投资. 本文适合: 曾了解过线程池却一直模模糊糊的人 了解得 ...

  7. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  8. java 等待线程/线程池执行完毕

    1.单线程开始并执行完毕 当线程开始后,需要用到join的方法 不废话直接贴代码 public static void main(String args[]) {long begin = System ...

  9. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

最新文章

  1. html恢复按钮按下前的状态,如何通过点击按钮暂停和恢复html页面的执行
  2. sql,nolock
  3. main()与_tmain()区别
  4. 英利1500伏光伏组件系列亮相美国
  5. 服务器最小化安装后的优化脚本
  6. 存储过程与函数oracle
  7. Create view failed with ORA-01031:insufficient privileges
  8. 6-4-2:STL之list——list的模拟实现
  9. Python 3 从入门到精通 Mac OS
  10. 计算机平面设计是计算机类吗,计算机平面设计是什么?平面设计就业前景怎么样?...
  11. php 返回英文乱码,使用php 5时MySQL返回乱码的解决办法_php
  12. Bugku:Snowfall
  13. 2018年度最优秀mac软件及游戏推荐,个个万里挑一
  14. 排序算法——十大排序算法总结与对比
  15. GRUB2命令和环境变量列表
  16. Android 绘制数字向上向下滚动的动画
  17. Minecraft 1.16.5模组开发(五十) 书籍词典 (Guide Book)
  18. 输出N阶方阵 ,输出该方阵及方阵主对角线的总和
  19. 防百度地图上下拖动View
  20. Nett源码剖析(1)NioEventloopGroup的创建2021SC@SDUSC

热门文章

  1. android 动画坐标,Android 动画之TranslateAnimation应用详解
  2. Leetcode每日一题:287.find-the-duplicate-number(寻找重复数)
  3. 吴恩达深度学习(一)-第三周:Planar data classification with one hidden layer
  4. matlab练习程序(共生矩阵)
  5. IntelliJ IDEA 创建Java Web项目
  6. [暴力]JZOJ 5842 a
  7. Logstash+Kibana+多ElasticSearch集群部署
  8. spirng底层实现原理
  9. LeetCode刷题(40)--Search a 2D Matrix
  10. GitHub Desktop理解与入门