Spring Boot使用Spring的异步线程池的实现
前言
线程池,从名字上来看,就是一个保存线程的"池子",凡事都有其道理,那线程池的好处在哪里呢?
我们要让计算机为我们干一些活,其实都是在使用线程,使用方法就是new一个Runnable接口或者新建一个子类,继承于Thread类,这就会涉及到线程对象的创建与销毁,这两个操作无疑是耗费我们系统处理器资源的,那如何解决这个问题呢?线程池其实就是为了解决这个问题而生的。
线程池提供了处理系统性能和大用户量请求之间的矛盾的方法,通过对多个任务重用已经存在的线程对象,降低了对线程对象创建和销毁的开销,由于当客户请求到了时,线程对象已经存在,可以提高请求的响应时间从而整体的提高了系统服务的表现。
本篇博客就是要总结一下,如何在Spring中使用异步线程池,给大家一个例子,去体会一下异步这个概念
实习生小王负责后台管理系统的报表分析,他的工作是负责操作后台系统,点击按钮,生成数据报表,而并不需要查看报表,由于数据量大,生成报表需要花费很长时间,而如果生成报表和其他工作在一个线程,小王就无法干其他工作了,所以需要将生成报表这个任务交给计算机的其他线程,这便是异步的体现。
在Spring中使用异步线程池
spring中提供了AsyncConfigurer这个配置接口,便于我们配置自己的异步线程池。
新建异步配置类
我习惯新建一个config包,然后将一些组件的配置类都放到里面
packagecom.example.wyh.config; importorg.springframework.context.annotation.Configuration; importorg.springframework.scheduling.annotation.AsyncConfigurer; importorg.springframework.scheduling.annotation.EnableAsync; importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; importjava.util.concurrent.Executor; /** *@author阳光大男孩!!! */ @Configuration @EnableAsync publicclassAsyncConfigimplementsAsyncConfigurer{ @Override publicExecutorgetAsyncExecutor(){ //定义线程池 ThreadPoolTaskExecutorthreadPoolTaskExecutor=newThreadPoolTaskExecutor(); //设置核心线程数 threadPoolTaskExecutor.setCorePoolSize(10); //设置线程池最大线程数 threadPoolTaskExecutor.setMaxPoolSize(30); //设置线程队列最大线程数 threadPoolTaskExecutor.setQueueCapacity(2000); //初始化线程池 threadPoolTaskExecutor.initialize(); returnthreadPoolTaskExecutor; } }
新建一个服务接口,并实现
packagecom.example.wyh.Service; /** *@author阳光大男孩!!! */ publicinterfaceAsyncService{ /** *测试使用异步线程池来执行工作 */ publicvoiduseAsyncThreadWork(); }
packagecom.example.wyh.Service; importorg.springframework.scheduling.annotation.Async; importorg.springframework.stereotype.Service; /** *@author阳光大男孩!!! */ @Service publicclassAsyncServiceImpimplementsAsyncService{ @Override @Async publicvoiduseAsyncThreadWork(){ System.out.println(Thread.currentThread().getName()); } }
在接口的具体实现中,我们打印了当前线程的名称,借以来查看是否是在一个心的线程中执行该任务。并且通过@Service注解告诉spring这是一个Service类型的bean,这样我们就可以让spring通过其自身容器来管理我们的对象,这就是IOC特性的一个体现。
新建一个Controller进行访问、测试
/** *@author阳光大男孩!!! */ @RestController publicclassAsyncController{ @Autowired AsyncServiceasyncService; @GetMapping("/testAsync") publicStringtestAsync() { System.out.println(Thread.currentThread().getName()); asyncService.useAsyncThreadWork(); return"testAsync方法执行成功..."; } }
可以看到,在上述代码中,我们使用@Autowired注解自动装配了刚才交给Spring容器管理的Service实现类对象,这是spring的DI特性体现。
由于我开的是8090端口,所以我访问的是8090端口
可以看到打印了两个线程的名称,第一个是在Controller中执行的线程名称,第二个则是spring通过我们刚才的配置,为我们从线程池中提取的线程并为我们执行相应任务。
总结
本篇博客简介了在spring中使用线程池异步执行任务的基本方法,为在项目中使用异步线程池提供了示例。
到此这篇关于SpringBoot使用Spring的异步线程池的实现的文章就介绍到这了,更多相关SpringBoot异步线程池内容请搜素毛票票以前的文章或下面相关文章,希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。