当前位置: 首页 > news >正文

SpringBoot整合、SpringBoot与异步任务

目录

    • 一、背景描述
    • 二、简单使用方法
    • 三、原理
    • 五、使用自定义线程池
      • 1、默认使用
      • 2、如何使用自定义线程池
    • 六、@Async失效情况
      • 1、同一个类中,一个方法调用 @Async标注的方法

一、背景描述

java 的代码是同步顺序执行,当我们需要执行异步操作时我们通常会去创建一个新线程去执行。比如new Thread()。start(),或者使用线程池线程池 new ThreadPoolExecutor().execute 。

在 Springboot 中对其进行了简化处理,使用@EnableAsync + @Async 可以快速开启一个异步线程执行任务

二、简单使用方法

启动类上使用 @EnableAsync ,开启异步任务支持

@EnableAsync
@SpringBootApplication
public class TaskMain {public static void main(String[] args) {SpringApplication.run(TaskMain.class,args);}
}

在需要异步执行的方法上添加注解 @Async

   @GetMapping("hello")public String hello(){asyncService.hello();System.out.println(new Date() + "success");return "ok";}@Asyncpublic void hello() {System.out.println(new Date() + "  " + Thread.currentThread().getName() + Thread.currentThread().getId());try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date() + "  " + Thread.currentThread().getName() + Thread.currentThread().getId() + "---->处理end");}

测试 Jemeter同时发送两个请求
在这里插入图片描述

三、原理

【看不太懂,之后再进行整理吧】

五、使用自定义线程池

1、默认使用

@Async默认使用的是 SimpleAsyncTaskExecutor , execute时,直接this.createThread(task) 也就是 new Tread来执行该任务
在这里插入图片描述

【缺点】SimpleAsyncTaskExecutor不限制并发线程且不重用线程,会为每个异步任务都创建有一个线程,在并发很高的情况下会导致程序内存耗尽

2、如何使用自定义线程池

1) 添加线程池配置,并将线程池注入到容器中

@Configuration
public class ThreadPoolConfig {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setMaxPoolSize(20);executor.setQueueCapacity(200);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix("taskExecutor-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}

2)使用@Async的时候,指定线程池

@Async("taskExecutor")public void hello() {System.out.println(new Date() + "  " + Thread.currentThread().getName() + Thread.currentThread().getId());try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date() + "  " + Thread.currentThread().getName() + Thread.currentThread().getId() + "---->处理end");}

在这里插入图片描述

六、@Async失效情况

1、同一个类中,一个方法调用 @Async标注的方法

@Service
public class AsyncDemoImpl implements AsyncDemo {// 注入spring上下文@Autowiredprivate ApplicationContext applicationContext;@Overridepublic void a() {System.out.println("开始执行a(): " + TimeUtil.getStringDate());// 通过上下文获取该类的实例,再调用该实例方法AsyncDemo asyncDemo = applicationContext.getBean(AsyncDemo.class);asyncDemo.b();System.out.println("执行结束a(): " + TimeUtil.getStringDate());}@Async@Overridepublic void b() {System.out.println("开始执行b(): " + TimeUtil.getStringDate());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行结束b(): " + TimeUtil.getStringDate());}
}
http://www.lryc.cn/news/125378.html

相关文章:

  • 复习1-2天【80天学习完《深入理解计算机系统》】第六天
  • 62、华为昇腾开发板Atlas 200I DK A2配置mmpose的hrnet模型推理python/c++
  • 【数据结构】双链表
  • android设置竖屏仍然跟随屏幕旋转怎么办
  • java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 tbms
  • 【Java】2021 RoboCom 机器人开发者大赛-高职组(初赛)题解
  • 汽车制造业上下游协作时 外发数据如何防泄露?
  • H13-922题库 HCIP-GaussDB-OLAP V1.5
  • 美团视觉GPU推理服务部署架构优化实战
  • 什么是前端框架?怎么学习? - 易智编译EaseEditing
  • logstash 原理(含部署)
  • CSS中的position属性有哪些值,并分别描述它们的作用。
  • 视频联网报警厂家怎么找?
  • 配置文件优先级解读
  • 在 React+Typescript 项目环境中创建并使用组件
  • UNIAPP中开发企业微信小程序
  • NGINX负载均衡及LVS-DR负载均衡集群
  • 由于目标计算机积极拒绝,无法连接。 Could not connect to Redis at 127.0.0.1:6379
  • 电脑提示数据错误循环冗余检查怎么办?
  • 剑指offer62.圆圈中最后剩下的数字
  • Python分享之 Spider
  • Golang项目中如何轻松实现私有仓库pkg包的引入
  • Python项目实战:基于napari的3D可视化(点云+slice)
  • go的gin和gorm框架实现切换身份的接口
  • 仓库库存管理难点在哪?有哪些仓库库存管理软件?
  • 服务链路追踪
  • macOS - 安装使用 libvirt、virsh
  • Windows Server 2019设置使用照片查看器查看图片的设置方法
  • 【需求输出】流程图输出
  • opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo