作者:追梦1819

原文:https://www.cnblogs.com/yanfei1819/p/11095891.html

版权声明:本文为博主原创文章,转载请附上博文链接!

## 引言

  系统中的异步任务有很多优点,例如:1)I/O受限等情况下,异步能提;2)增强系统的健壮性;3)改善用户体验。

  但是也有一些缺点,例如:1)如果滥用的话会影响系统的性能;2)相对于同步编程来说,增加编程的难度。

  本章不对异步任务的优缺点做过多的详解,是否需要使用异步任务,要根据系统的业务来决定。本章只阐述 SpringBoot 中的异步任务。

版本信息

  • JDK:1.8

  • SpringBoot :2.1.4.RELEASE

  • maven:3.3.9

  • IDEA:2019.1.1

异步任务使用

  关于异步任务的使用,结果的展示可能不是很明显。我们先创建几个常规的方法,然后再使之异步,看看两者结果的区别。

先创建一个项目,引入 web 的 maven 依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后创建几个常用的方法:

package com.yanfei1819.asynctaskdemo.task;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; /**
* Created by 追梦1819 on 2019-06-21.
*/
@Component
public class AsyncTask {
public void task01() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第一个异步任务!");
Thread.sleep(2000);
Long end = System.currentTimeMillis();
System.out.println("第一个任务执行时间是:"+(end-start));
}
public void task02() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第二个异步任务!");
Thread.sleep(3000);
Long end = System.currentTimeMillis();
System.out.println("第二个任务执行时间是:"+(end-start));
}
public void task03() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第三个异步任务!");
Thread.sleep(4000);
Long end = System.currentTimeMillis();
System.out.println("第三个任务执行时间是:"+(end-start));
}
}

下面创建一个测试类:

package com.yanfei1819.asynctaskdemo.web.controller;

import com.yanfei1819.asynctaskdemo.task.AsyncTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* Created by 追梦1819 on 2019-06-21.
*/
@RestController
public class TaskController {
@Autowired
private AsyncTask asyncTask;
@GetMapping("/testTask")
public void testTask() throws InterruptedException {
Long start = System.currentTimeMillis();
asyncTask.task01();
asyncTask.task02();
asyncTask.task03();
Long end = System.currentTimeMillis();
System.out.println("三个任务执行总时间是:"+(end-start));
}
}

最后启动项目,访问 localhost:8080/testTask ,结果如下:

很明显这是很常规的同步方法。下面我们使用 SpringBoot 自带的异步方法实现方式作异步处理。

需要改动的地方有两处:

  1. 在启动类的中加注解 @EnableAsync ;
  2. 在异步的方法上加注解 @Async。

重启项目,访问同一个路径,以下是结果:

总结

  异步任务的使用跟其他的用法一样很简单,SpringBoot 也将其集成到 Spring 生态圈中,只需要使用其中的几个注解即可。后续将分析其原理。

SpringBoot第十八篇:异步任务的更多相关文章

  1. Python之路【第十八篇】:Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  2. SpringBoot第二十四篇:应用监控之Admin

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章(S ...

  3. Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)

    第十八篇(书中 8.5~8.7 节 内容) 其实语法篇,我感觉没必要写录入到日记里. 我也犹豫了好久,到底要不要录入. 这样,我先读一遍语法篇的所有内容,我觉得值得留下的,我就录入日记里. 不然像昨天 ...

  4. SpringBoot第十五篇:swagger构建优雅文档

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11007470.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前面的十四 ...

  5. Android UI开发第二十八篇——Fragment中使用左右滑动菜单

    Fragment实现了Android UI的分片管理,尤其在平板开发中,好处多多.这一篇将借助Android UI开发第二十六篇——Fragment间的通信. Android UI开发第二十七篇——实 ...

  6. SpringBoot非官方教程 | 第十八篇: 定时任务(Scheduling Tasks)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot18-scheduling/ 本文出自方志朋的博客 ...

  7. Python开发【第十八篇】Web框架之Django【基础篇】

    一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...

  8. 第十八篇 ANDROID的声音管理系统及服务

     声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置 ...

  9. Python全栈开发之路 【第十八篇】:Ajax技术

    Ajax技术 Ajax = 异步 JavaScript 和 XML. Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 1.jQuery的load()方法 jQuery loa ...

随机推荐

  1. JDBC解耦案例

    原始JDBC连接 package jdbc; import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sq ...

  2. 嵌入式Linux+NetCore 笔记一

    记录嵌入式Linux+NetCore培训中遇到的一些问题以及解决方法 十一放假期间发现园里大神大石头(NewLife团队)开了一个嵌入式Linux+NetCore培训,就报名参加了.更幸运的是,我刚好 ...

  3. Java自学-集合框架 Collections

    Java集合框架 工具类Collections Collections是一个类,容器的工具类,就如同Arrays是数组的工具类 步骤 1 : 反转 reverse 使List中的数据发生翻转 pack ...

  4. 使用qwt作曲线图——有网格线背景的画法

    创建自己的QwtPlot (1)     增加一个类比如curvePlotWidget,继承自QwtPlot (2)代码示例 curvePlotWidget::curvePlotWidget(QWid ...

  5. mac上配置python的安装环境杂记

    现在的python的包都是通过pip安装的. 所以非常重要的一步是配置pip的安装源 vi ~/.pip/pip.conf [global] index-url = http://pypi.douba ...

  6. Django的版本坑

    Django2.x与1.x版本之间的坑 App模块中models.py django2.x是中reverse使用方法 from django.urls import reverse ForeignKe ...

  7. Spark之RDD

    Spark学习之路Spark之RDD 目录 一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数 ...

  8. luogu P1904 天际线

    分析 都知道是从左向右扫描 可是该维护什么,扫描什么? 注意想想怎么输出, 实际上它要的输出就是图形的轮廓,即每个突出块的左上节点的x,y 所以说, 我们可以把扫描线扫进的楼房放入线段树,扫出的楼房删 ...

  9. BeanShell实现加密解密功能

    一,在IDEA中写好加密的脚本 二,然后将整个包文件导出,生成jar包 三,将jar包文件放到jmeter的lib/ext目录下 然后在jmeter的BeanShell中引入该类,调用其中的加密方法 ...

  10. 15-numpy笔记-莫烦pandas-3

    代码 import pandas as pd import numpy as np dates = pd.date_range('20130101', periods=6) df=pd.DataFra ...