Spring Boot 使用Spring的异步线程池

前言

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

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

线程池提供了处理系统性能和大用户量请求之间的矛盾的方法,经过对多个任务重用已经存在的线程对象,下降了对线程对象建立和销毁的开销,因为当客户请求到了时,线程对象已经存在,能够提升请求的响应时间从而总体的提升了系统服务的表现。bash

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

实习生小王负责后台管理系统的报表分析,他的工做是负责操做后台系统,点击按钮,生成数据报表,而并不须要查看报表,因为数据量大, 生成报表须要花费很长时间,而若是生成报表和其余工做在一个线程,小王就没法干其余工做了,因此须要将生成报表这个任务交给计算机的其余线程,这即是异步的体现。异步

在Spring中使用异步线程池async

spring中提供了AsyncConfigurer这个配置接口,便于咱们配置本身的异步线程池。ide

新建异步配置类

我习惯新建一个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特性的一个体现。ui

新建一个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中使用线程池异步执行任务的基本方法,为在项目中使用异步线程池提供了示例。

最后

上面都是本身整理好的!我就把资料贡献出来给有须要的人!顺便求一波关注,哈哈~各位小伙伴关注我后私信【Java】就能够免费领取哒 博主:阳光大男孩 原文连接: blog.csdn.net/weixin_4388…
相关文章
相关标签/搜索