深入学习springboot线程池的使用和扩展

  

  

我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务,

  

  
      <李> windowns10;李   <李> jdk1.8;李   <李> springboot 1.5.9.RELEASE;李   <李>开发工具:IntelliJ IDEA;李   
  


  

  

本次实战的源码可以在我的GitHub下载,地址:git@github.com: zq2599/blog_demos.git项目主页:

  

这里面有多个工程,本次用到的工程为threadpooldemoserver

  

实战步骤梳理
  

  

本次实战的步骤如下:

  
      <李>创建springboot工程;李   <李>创建服务层的接口和实现,李   <李>创建控制器,开发一个http服务接口,里面会调用服务层的服务,李   <李>创建线程池的配置;李   <李>将服务层的服务异步化,这样每次调用都会都被提交到线程池异步执行;李   <李>扩展ThreadPoolTaskExecutor,在提交任务到线程池的时候可以观察到当前线程池的情况,李   
  


  

  

用IntelliJ IDEA创建一个springboot的web工程threadpooldemoserver, pom.xml内容如下:

        & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt;项目xmlns=" http://maven.apache.org/POM/4.0.0 " xmlns: xsi=" http://www.w3.org/2001/XMLSchema-instance "   xsi: schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”比;   & lt; modelVersion> 4.0.0   & lt; groupId> com.bolingcavalry   & lt; artifactId> threadpooldemoserver   & lt; version> 0.0.1-SNAPSHOT   & lt; packaging> jar   & lt; name> threadpooldemoserver   春天Boot< & lt; description>演示项目;/description>   & lt; parent>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-parent   & lt; version> 1.5.9.RELEASE   & lt; relativePath/比;& lt; !——从库中查找父——比;   & lt;/parent>   & lt; properties>   & lt; project.build.sourceEncoding> UTF-8   & lt; project.reporting.outputEncoding> UTF-8   & lt; java.version> 1.8 & lt;/java.version>   & lt;/properties>   & lt; dependencies>   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-web   & lt;/dependency>   & lt;/dependencies>   & lt; build>   & lt; plugins>   & lt; plugin>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-maven-plugin   & lt;/plugin>   & lt;/plugins>   & lt;/build>   & lt;/project>      

  

创建一个服务层的接口AsyncService,如下:

        公共接口AsyncService {/* *   *执行异步任务   */空白executeAsync ();   }      

对应的AsyncServiceImpl,实现如下:

        @ service   公共类AsyncServiceImpl实现AsyncService {   私有静态最终日志记录器=LoggerFactory.getLogger (AsyncServiceImpl.class);   @Override   公共空间executeAsync () {   logger.info(“开始executeAsync”);   尝试{   thread . sleep (1000);   }捕捉(异常e) {   e.printStackTrace ();   }   logger.info (“executeAsync终结”);   }   }      

这个方法做的事情很简单:睡了一秒钟;

  


  

  

创建一个控制器为你好,里面定义一个http接口,做的事情是调用服务层的服务,如下:

        @RestController   公开课你好{   私有静态最终日志记录器=LoggerFactory.getLogger (Hello.class);   @ autowired   私人AsyncService AsyncService;   @RequestMapping (“/?   公共字符串提交(){   logger.info(“开始提交”);//调用服务层的任务   asyncService.executeAsync ();   logger.info(“提交”);   返回“成功”;   }   }      

至此,我们已经做好了一个http请求的服务,里面做的事情其实是同步的,接下来我们就开始配置springboot的线程池服务,将服务层做的事情都提交到线程池中去处理;

  


  

  

创建一个配置类ExecutorConfig,用来定义如何创建一个ThreadPoolTaskExecutor,要使用@ configuration和@EnableAsync这两个注解,表示这是个配置类,并且是线程池的配置类,如下所示:

深入学习springboot线程池的使用和扩展