1. 程式人生 > 程式設計 >Spring Boot使用Spring的非同步執行緒池的實現

Spring Boot使用Spring的非同步執行緒池的實現

前言

執行緒池,從名字上來看,就是一個儲存執行緒的"池子",凡事都有其道理,那執行緒池的好處在哪裡呢?

我們要讓計算機為我們幹一些活,其實都是在使用執行緒,使用方法就是new一個Runnable介面或者新建一個子類,繼承於Thread類,這就會涉及到執行緒物件的建立與銷燬,這兩個操作無疑是耗費我們系統處理器資源的,那如何解決這個問題呢? 執行緒池其實就是為了解決這個問題而生的。

執行緒池提供了處理系統性能和大使用者量請求之間的矛盾的方法,通過對多個任務重用已經存在的執行緒物件,降低了對執行緒物件建立和銷燬的開銷,由於當客戶請求到了時,執行緒物件已經存在,可以提高請求的響應時間從而整體的提高了系統服務的表現。

本篇部落格就是要總結一下,如何在Spring中使用非同步執行緒池,給大家一個例子,去體會一下非同步這個概念

實習生小王負責後臺管理系統的報表分析,他的工作是負責操作後臺系統,點選按鈕,生成資料報表,而並不需要檢視報表,由於資料量大, 生成報表需要花費很長時間,而如果生成報表和其他工作在一個執行緒,小王就無法幹其他工作了,所以需要將生成報表這個任務交給計算機的其他執行緒,這便是非同步的體現。

在Spring中使用非同步執行緒池

spring中提供了AsyncConfigurer這個配置介面,便於我們配置自己的非同步執行緒池。

新建非同步配置類

我習慣新建一個config包,然後將一些元件的配置類都放到裡面

Spring Boot使用Spring的非同步執行緒池的實現

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埠

Spring Boot使用Spring的非同步執行緒池的實現

可以看到列印了兩個執行緒的名稱,第一個是在Controller中執行的執行緒名稱,第二個則是spring通過我們剛才的配置,為我們從執行緒池中提取的執行緒併為我們執行相應任務。

Spring Boot使用Spring的非同步執行緒池的實現

總結

本篇部落格簡介了在spring中使用執行緒池非同步執行任務的基本方法,為在專案中使用非同步執行緒池提供了示例。

到此這篇關於Spring Boot使用Spring的非同步執行緒池的實現的文章就介紹到這了,更多相關Spring Boot 非同步執行緒池內容請搜素我們以前的文章或下面相關文章,希望大家以後多多支援我們!