热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

SpringBoot使用Spring的异步线程池的实现

这篇文章主要介绍了SpringBoot使用Spring的异步线程池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

线程池,从名字上来看,就是一个保存线程的"池子",凡事都有其道理,那线程池的好处在哪里呢?

我们要让计算机为我们干一些活,其实都是在使用线程,使用方法就是new一个Runnable接口或者新建一个子类,继承于Thread类,这就会涉及到线程对象的创建与销毁,这两个操作无疑是耗费我们系统处理器资源的,那如何解决这个问题呢? 线程池其实就是为了解决这个问题而生的。

线程池提供了处理系统性能和大用户量请求之间的矛盾的方法,通过对多个任务重用已经存在的线程对象,降低了对线程对象创建和销毁的开销,由于当客户请求到了时,线程对象已经存在,可以提高请求的响应时间从而整体的提高了系统服务的表现。

本篇博客就是要总结一下,如何在Spring中使用异步线程池,给大家一个例子,去体会一下异步这个概念

实习生小王负责后台管理系统的报表分析,他的工作是负责操作后台系统,点击按钮,生成数据报表,而并不需要查看报表,由于数据量大, 生成报表需要花费很长时间,而如果生成报表和其他工作在一个线程,小王就无法干其他工作了,所以需要将生成报表这个任务交给计算机的其他线程,这便是异步的体现。

在Spring中使用异步线程池

spring中提供了AsyncConfigurer这个配置接口,便于我们配置自己的异步线程池。

新建异步配置类

我习惯新建一个config包,然后将一些组件的配置类都放到里面

package com.example.wyh.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

/**
 * @author 阳光大男孩!!!
 */
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
  @Override
  public Executor getAsyncExecutor() {
    //定义线程池
    ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    //设置核心线程数
    threadPoolTaskExecutor.setCorePoolSize(10);
    //设置线程池最大线程数
    threadPoolTaskExecutor.setMaxPoolSize(30);
    //设置线程队列最大线程数
    threadPoolTaskExecutor.setQueueCapacity(2000);
    //初始化线程池
    threadPoolTaskExecutor.initialize();

    return threadPoolTaskExecutor;
  }
}

在上面代码中,我们使用@Configuration告诉spring这是一个配置类,使用注解@EnableAsync让spring开启异步可用。 这样以后如果想把某个方法中的任务异步地放到另外一个线程,只需要通过方法上加 @Async注解即可。

新建一个服务接口,并实现

package com.example.wyh.Service;

/**
 * @author 阳光大男孩!!!
 */
public interface AsyncService {

  /**
   * 测试使用异步线程池来执行工作
   */
  public void useAsyncThreadWork();
  
}
package com.example.wyh.Service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @author 阳光大男孩!!!
 */
@Service
public class AsyncServiceImp implements AsyncService{

  @Override
  @Async
  public void useAsyncThreadWork() {
    System.out.println(Thread.currentThread().getName());

  }
}

在接口的具体实现中,我们打印了当前线程的名称,借以来查看是否是在一个心的线程中执行该任务。并且通过@Service注解告诉spring这是一个Service类型的bean,这样我们就可以让spring通过其自身容器来管理我们的对象,这就是IOC特性的一个体现。

新建一个Controller 进行访问、测试

/**
 * @author 阳光大男孩!!!
 */
@RestController
public class AsyncController {

  @Autowired
  AsyncService asyncService;
  @GetMapping("/testAsync")
  public String testAsync()
  {
    System.out.println(Thread.currentThread().getName());
    asyncService.useAsyncThreadWork();
    return "testAsync方法执行成功...";
  }
}

可以看到,在上述代码中,我们使用 @Autowired注解自动装配了刚才交给Spring容器管理的Service实现类对象,这是spring 的DI特性体现。

由于我开的是8090端口,所以我访问的是8090端口


可以看到打印了两个线程的名称,第一个是在Controller中执行的线程名称,第二个则是spring通过我们刚才的配置,为我们从线程池中提取的线程并为我们执行相应任务。

总结

本篇博客简介了在spring中使用线程池异步执行任务的基本方法,为在项目中使用异步线程池提供了示例。

到此这篇关于Spring Boot使用Spring的异步线程池的实现的文章就介绍到这了,更多相关Spring Boot 异步线程池内容请搜素以前的文章或下面相关文章,希望大家以后多多支持!


推荐阅读
  • 本文探讨了现代分布式架构的多样性,包括高并发、多活数据中心、容器化、微服务、高可用性和弹性架构等,并介绍了与这些架构相关的重要管理技术,如DevOps、应用监控和自动化运维。文章还深入分析了分布式系统的核心概念、主要用途及类型,同时对比了单体应用与分布式服务化的优缺点。 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • Lua编程进阶:数组与迭代器详解
    本文深入探讨了Lua语言中的数组和迭代器,通过实例讲解了一维数组、多维数组的使用方法及迭代器的工作原理。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • Matlab 实现工程与科学问题 - 第三章个人解析
    作为一名在读大学生,本文分享了我对《工程与科学中的Matlab应用》第三章习题的个人解决方案。欢迎通过私信或评论进行交流和讨论,但不接受任何形式的权威指导。文中提供了详细的代码实现,旨在促进学习和共同进步。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
author-avatar
Martha829
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有