作者:追梦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. RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装

    边学习边更新这专题,随手记录一下用到的思路,给自己看的(所以读者看可能有些懵,不好意思...) RootKit随手记(一)RootKit的驱动隐藏.读取配置.卸载安装 一.驱动隐藏 1. 隐藏原理 一 ...

  2. Kafka学习笔记之Kafka性能测试方法及Benchmark报告

    0x00 概述 本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工作状态,最后给出了Kafka ...

  3. webform的原生操作图片预览和上传

    1.使用input标签进行图片操作,input的标签有一个accept属性,accept 属性只能与 <input type="file"> 配合使用.它规定能够通过文 ...

  4. 重温CLR(十八) 运行时序列化

    序列化是将对象或对象图转换成字节流的过程,反序列化是将字节流转换回对象图的过程.在对象和字节流之间转换是很有用的机制. 1 应用程序的状态(对象图)可轻松保存到磁盘文件或数据库中,并在应用程序下次运行 ...

  5. 利用Java EE里jsp制作登录界面

    jsp连接数据库.百度经验. 1.在新建的Project中右键新建Floder 2.创建名为lib的包 3.创建完毕之后的工程目录 4.接下来解压你下载的mysql的jar包,拷贝其中的.jar文件 ...

  6. LinuxShell——特殊符号

    LinuxShell——特殊符号 摘要:本文主要学习了Shell命令中具有特殊功能的一些符号. 多命令执行 顺序执行“;” 如果使用“;”连接多条命令,那么这些命令会依次执行,但是各命令之间没有任何逻 ...

  7. GitBash上传项目出现[fatal: remote origin already exists.]问题解决方案

    问题截图如下: 当出现这个问题时,不要慌,只需要输入 git remote rm origin 就可以解决,输入完前面的命令后再次 输入 git remote add origin https://. ...

  8. Ext中statics()与self

    var self = this; var statics = self.statics();//所在类的静态成员(instance.statics():跟着所在类走,在哪个类中,就返回哪个类中的静态成 ...

  9. android studio学习----gradle基础

    Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在And ...

  10. 2.InfluxDB-InfluxQL基础语法教程--目录

    本文翻译自官网,官方文档地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) InfluxQL ...