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

 更新时间:2020年02月21日 10:12:27   作者:阳光大男孩!!!  
这篇文章主要介绍了Spring Boot使用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 异步线程池内容请搜素脚本之家以前的文章或下面相关文章,希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC五种类型参数传递及json传递参数

    SpringMVC五种类型参数传递及json传递参数

    本文主要介绍了SpringMVC五种类型参数传递及json传递参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java连接mysql数据库学习示例

    java连接mysql数据库学习示例

    这篇文章主要介绍了java连接mysql数据库学习示例,需要的朋友可以参考下
    2014-03-03
  • Java Stream的基本概念以及创建方法

    Java Stream的基本概念以及创建方法

    这篇文章主要介绍了Java Stream的基本概念以及创建方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • Java数据结构之基于比较的排序算法基本原理及具体实现

    Java数据结构之基于比较的排序算法基本原理及具体实现

    最近刚学习完七种比较常见的基于比较的排序算法,感觉比较重要,所以写个博客记录一下,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • java编程实现求解八枚银币代码分享

    java编程实现求解八枚银币代码分享

    这篇文章主要介绍了java编程实现求解八枚银币代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java提供的4种函数式接口

    java提供的4种函数式接口

    这篇文章主要介绍了java提供的4种函数式接口,函数接口是只有一个抽象方法的接口,用作 Lambda 表达式的类型并有且只有一个抽象方法的接口,下文详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • mybatis抽取基类BaseMapper增删改查的实现

    mybatis抽取基类BaseMapper增删改查的实现

    目前项目当中使用mapper.xml文件方式对数据库进行操作,但是每个里边都有增/删/改/查,为了方便开发,把这些公共的代码提取出来,不用当做基类,不用每个Mapper文件都写了,本文就详细的介绍一下实现方法
    2021-09-09
  • Spring Boot系列教程之死信队列详解

    Spring Boot系列教程之死信队列详解

    这篇文章主要给大家介绍了关于Spring Boot系列教程之死信队列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Spring Boot mybatis-config 和 log4j 输出sql 日志的方式

    Spring Boot mybatis-config 和 log4j 输出sql 日志的方式

    这篇文章主要介绍了Spring Boot mybatis-config 和 log4j 输出sql 日志的方式,本文通过实例图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • java中把字符串转成 double的方法

    java中把字符串转成 double的方法

    Java 中可以使用 Double 类中的静态方法 parseDouble() 将一个字符串转换为 double 类型的数值,本文结合实例代码对java字符串转成 double详细讲解,需要的朋友参考下吧
    2023-08-08

最新评论