在网上找了很多很多资料,使用多线程、异步线程等等,很多配置,方法也多多;

那么,我向来都是以简单,够用为目标,下面我介绍的就是我认为已经非常非常简单的异步线程使用的方法了。

说到简单,当然是使用注解。

进入正题:

先上个目录结构:

好了,我们这次是在springboot里面使用的,不用导啥包。

我们先创个异步线程的配置类, 我的叫ThreadConfig,你们随意:

package com.async.config;import java.util.concurrent.Executor;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@ComponentScan("com.async.service")
@EnableAsync
public class ThreadConfig  {/*** 执行需要依赖线程池,这里就来配置一个线程池* @return*/// 当池子大小小于corePoolSize,就新建线程,并处理请求// 当池子大小等于corePoolSize,把请求放入workQueue(QueueCapacity)中,池子里的空闲线程就去workQueue中取任务并处理// 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理// 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁@Bean("getExecutor")public Executor getExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置核心线程数executor.setCorePoolSize(10);//设置最大线程数executor.setMaxPoolSize(100);//线程池所使用的缓冲队列executor.setQueueCapacity(250);//设置线程名executor.setThreadNamePrefix("JcTest-Async");//设置多余线程等待的时间,单位:秒//executor.setKeepAliveSeconds();// 初始化线程executor.initialize();return executor;}
}

向来我都不做代码过多的解释,因为我的代码注释 已!经!足!够!详!细 ! 了!

不过还是得提一下这俩注解,

@ComponentScan("com.async.service") 这个是告诉全世界,我即将开启异步线程的业务方法是哪个
@EnableAsync 这个! 必须有!  告诉全世界允许我使用异步线程

好了,接下来我们创建一下业务层的东西吧:

AsyncTestService:

package com.async.service;public interface AsyncTestService {/*** 这里将会在impl里标注为异步任务,在执行此方法的时候,会单独开启线程来执行*/void function1() throws InterruptedException;void function2();
}

AsyncTestServiceImpl:

package com.async.service.impl;import com.async.service.AsyncTestService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.util.UUID;@Service
public class AsyncTestServiceImpl implements AsyncTestService {/*** 这里进行标注为异步任务,在执行此方法的时候,会单独开启线程来执行*/@Async("getExecutor")public void function1() throws InterruptedException {System.out.println("f1 : " + Thread.currentThread().getName() + "   " + UUID.randomUUID().toString());
//        try {
//            Thread.sleep(10000);
//            System.out.println("EEEE");
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }//故意等10秒,那么异步线程开起来,这样明显看到 2方法不用等1方法执行完再调用了Thread.sleep(10000);System.out.println("EEEE");}@Async("getExecutor")public void function2() {System.out.println("f2 : " + Thread.currentThread().getName() + "   " + UUID.randomUUID().toString());try {Thread.sleep(100);System.out.println("aaaa");} catch (InterruptedException e) {e.printStackTrace();}}
}

代码不走读了,但是必须得提下注解:

@Async 这个是告诉全世界,这里! 只要被调用,就是会开启一个异步线程。

至于后面加上("getExecutor"),是为了指定读取自己写的配置信息例如线程名称那些。

最后是TestController:

package com.async.test;import com.async.service.AsyncTestService;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@AutowiredAsyncTestService asyncTestService;@GetMapping("/test")public void test() throws InterruptedException {
//        for (int i = 0; i < 10; i++) {
//            asyncTestService.function1(); // 执行异步任务
//            asyncTestService.function2();
//        }asyncTestService.function1(); // 执行异步任务asyncTestService.function2();}
}

启动类没啥改变:

package com.async;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class AsyncApplication {public static void main(String[] args) {SpringApplication.run(AsyncApplication.class, args);}
}

好了,跑一下:

结合代码看看,懂了吧应该。

稍微解释一哈:

asyncTestService.function1(); // 执行异步任务

asyncTestService.function2();

本来按照正常,肯定是按顺序执行的,也就是先编译完方法1,输出所有东东,再到方法2;

然后我们配了异步,而且在方法1那边sleep了蛮久的, 所以你看到输出结果,显然方法2自己单飞了,并没有等方法1;

这结果是我们想要的。

最后提醒一下, 有没有发现,我这个例子分了好多层,而且连impl都分了的。其实不分那么细也没问题,但是!!!

有个需要注意的!  利用@Async注解的方法, 不能跟调用它的方法放在同个类里面!!!! 否则会循环依赖错误!!!

还有一个需要注意的,@Async所修饰的函数不要定义为static类型,这样异步调用不会生效!

好了,就到这吧。

SpringBoot 最简单的使用异步线程案例 @Async相关推荐

  1. 复盘SpringBoot中定时任务和异步线程池

    作者:溪~源 blog.csdn.net/xuan_lu/article/details/110568508 项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑 ...

  2. springboot使用异步线程池执行自定义任务实例

    文章目录 1.介绍 配置类 业务层 控制层 1.介绍 在Spring中存在一个AsyncConfigurer接口,它是一个可以配置异步线程池的接口,因此只需要Java配置文件,实现AsyncConfi ...

  3. SpringBoot中异步线程池AsynConfigurer配置

    目录​​​​​​​ 什么是AsynConfigurer 为什么需要AsynConfigurer 怎么配置AsynConfigurer 注意事项 统一异常捕获 其他相关类 AsyncExecutionI ...

  4. 复盘Spring中定时任务和异步线程池

    ​ 项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑问,现在利用空余时间进行一次复盘. 项目搭建 项目搭建环境:JDK1.8+SpringBoot 主启动类: ...

  5. 异步调用案例_异步案例研究

    异步调用案例 In March 2020 our work related world changed drastically due to COVID-19. Previously our team ...

  6. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  7. SpringBoot - 优雅的实现【异步编程】

    文章目录 概述 V1.0 默认的实现 Step1 搞配置类,开启@EnableAsync Step2 搞方法标记 @Async注解 Step3 搞调用 Spring提供的线程池 V2.0 实现@Asy ...

  8. Spring Boot系列二 Spring @Async异步线程池用法总结

    转载 自 https://blog.csdn.net/hry2015/article/details/67640534 1. TaskExecutor Spring异步线程池的接口类,其实质是java ...

  9. 一则故事表达:并发,并行,同步,异步,线程,多线程

    一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅 ...

最新文章

  1. PyTorch如何构建和实验神经网络
  2. c语言会一点然后学java_学C语言自己写的一个程序
  3. KVM虚拟化笔记(十三)------kvm虚拟机静态迁移
  4. PBS_HAS_CHANGED ~ GET_SAP_MENU_INFO
  5. word自定义模板的存储位置
  6. 空间谱专题02:波束形成(Beamforming)
  7. 全国计算机等级考试题库二级C操作题100套(第41套)
  8. dell服务器怎么看硬件状态,从DELL 2950和DELL R710看服务器硬件
  9. HLSL Tips 1:如何把输入映射到输出像素
  10. Dubbo使用Sentinel来对服务进行降级与限流
  11. C语言52单片机串口中断,52单片机的中断及其使用方法
  12. windows保护无法启动修复服务器,win10使用命令修复系统时提示Windows 资源保护无法启动修复服务怎么办...
  13. 从360首席科学家到区块链创业者,苦钻代码、强迫自己看白皮书,原来这个圈子都是这么努力的 | 人物志...
  14. 骨传导耳机是什么意思?骨传导耳机工作原理是什么
  15. 豆沙绿护眼色样式在html中的代码
  16. 关于Java位运算里的“按位异或”
  17. 【python】flask框架
  18. Weakly Supervised Deep Learning for Thoracic DiseaseClassification and Localization on Chest X-rays
  19. python123 io平台-Java Review(三十六、IO)
  20. 液压减振器 matlab,汽车减振器的结构分析与性能仿真研究

热门文章

  1. 在javaScript中,变量名和函数名不能重名
  2. 20世纪最好的10个算法(转)
  3. 赛效:电脑在线美化图片怎么弄?
  4. 与Xcode比照Adobe AIR开发iOS的优势和局限
  5. SpringBoot学习(六)——springboot整合后台模板
  6. springBoot项目--平台控制商品订单中各商家打印机打印小票--终极版
  7. 10亿手机号如何去重?(BitMap)
  8. 微信 libco 协程库原理剖析
  9. Scala 简介 [摘自 Scala程序设计 ]
  10. 安装小觅相机(1030)驱动以及如何将Ubuntu18.04的内核降到4.15.0版本