最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot使用多線程過程步驟解析

 更新時間:2020年07月31日 10:18:42   作者:MisMe  
這篇文章主要介紹了Spring boot使用多線程過程步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

Spring中實現(xiàn)多線程,其實非常簡單,只需要在配置類中添加@EnableAsync就可以使用多線程。在希望執(zhí)行的并發(fā)方法中使用@Async就可以定義一個線程任務(wù)。通過spring給我們提供的ThreadPoolTaskExecutor就可以使用線程池。

第一步,先在Spring Boot主類中定義一個線程池,比如:

package com.jmxf.core.config;

import java.util.concurrent.Executor;

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

@Configuration
@EnableAsync // 啟用異步任務(wù)
public class AsyncConfiguration {

  // 組件計算
  @Bean("zjExecutor")
  public Executor asyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    //核心線程數(shù)5:線程池創(chuàng)建時候初始化的線程數(shù)
    executor.setCorePoolSize(5);
    //最大線程數(shù)5:線程池最大的線程數(shù),只有在緩沖隊列滿了之后才會申請超過核心線程數(shù)的線程
    executor.setMaxPoolSize(10);
    //緩沖隊列500:用來緩沖執(zhí)行任務(wù)的隊列
    executor.setQueueCapacity(500);
    //允許線程的空閑時間60秒:當(dāng)超過了核心線程出之外的線程在空閑時間到達(dá)之后會被銷毀
    executor.setKeepAliveSeconds(60);
    //線程池名的前綴:設(shè)置好了之后可以方便我們定位處理任務(wù)所在的線程池
    executor.setThreadNamePrefix("DailyAsync-");
    executor.initialize();
    return executor;
  }
}

有很多你可以配置的東西。默認(rèn)情況下,使用SimpleAsyncTaskExecutor。

第二步,使用線程池

在定義了線程池之后,我們?nèi)绾巫尞惒秸{(diào)用的執(zhí)行任務(wù)使用這個線程池中的資源來運(yùn)行呢?方法非常簡單,我們只需要在@Async注解中指定線程池名即可,比如:

package com.jmxf.service.fkqManage.zj;


import org.springframework.scheduling.annotation.Async;

@Service
public class CentreZj {


  /**
   * 多線程執(zhí)行 zj計算推數(shù)
   * @param fkqZj
   * @throws Exception
   */
  @Async("zjExecutor")
  public CompletableFuture<String> executeZj (FkqZj fkqZj) {
    if(fkqZj == null) return;
    String zjid = fkqZj.getZjid();
    FkqHdzjdm zjdm = getZjdm(zjid);
    String zjlj = zjdm.getZjlj();
    if(StringUtils.isBlank(zjlj)) return;
    Object bean = ApplicationContextProvider.getBean(zjlj);
    Method method;
    try {
      method = bean.getClass().getMethod("refresh",String.class);
      method.invoke(bean,zjid);
    } catch (Exception e) {
      e.printStackTrace();
    } 
  }
  return CompletableFuture.completedFuture(zjid);

}

executeZj方法被標(biāo)記為Spring的 @Async 注解,表示它將在一個單獨(dú)的線程上運(yùn)行。該方法的返回類型是 CompleetableFuture 而不是 String,這是任何異步服務(wù)的要求。

第三步,調(diào)用測試

List<CompletableFuture<String>> executeZjs = new ArrayList<>();
    for (FkqZj fkqZj : zjs) {
      CompletableFuture<String> executeZj = centreZj.executeZj(fkqZj);
      executeZjs.add(executeZj);
    }
    //等待所以子線程結(jié)束后 返回結(jié)果
    for (CompletableFuture<String> completableFuture : executeZjs) {
      CompletableFuture.allOf(completableFuture).join();
    }

注意事項

異步方法和調(diào)用方法一定要寫在不同的類中 ,如果寫在一個類中,是沒有效果的!

原因:

spring對@Transactional注解時也有類似問題,spring掃描時具有@Transactional注解方法的類時,是生成一個代理類,由代理類去開啟關(guān)閉事務(wù),而在同一個類中,方法調(diào)用是在類體內(nèi)執(zhí)行的,spring無法截獲這個方法調(diào)用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用java一維數(shù)組模擬壓棧彈棧

    使用java一維數(shù)組模擬壓棧彈棧

    這篇文章主要介紹了如何使用java一維數(shù)組模擬壓棧彈棧,需要的朋友可以參考下
    2021-04-04
  • Java關(guān)于后端怎么去接收Date、LocalDateTime類型的參數(shù)詳解

    Java關(guān)于后端怎么去接收Date、LocalDateTime類型的參數(shù)詳解

    這篇文章主要介紹了java關(guān)于后端怎么去接收Date、LocalDateTime類型的參數(shù),文中有詳細(xì)的代碼流程,對我們學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • Java報錯Non-terminating?decimal?expansion解決分析

    Java報錯Non-terminating?decimal?expansion解決分析

    這篇文章主要為大家介紹了Java報錯Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java設(shè)計模式之組合模式的示例詳解

    Java設(shè)計模式之組合模式的示例詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下
    2022-03-03
  • JAVA不使用線程池來處理的異步的方法詳解

    JAVA不使用線程池來處理的異步的方法詳解

    這篇文章主要介紹了JAVA不使用線程池來處理的異步的方法,在這個示例中,asyncTask方法創(chuàng)建了一個新的線程來執(zhí)行異步任務(wù),這個新線程會立即開始執(zhí)行,而主線程則會繼續(xù)執(zhí)行后續(xù)的代碼,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解

    java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解

    這篇文章主要介紹了java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • JAVA定義變量與輸出詳解

    JAVA定義變量與輸出詳解

    這篇文章主要介紹了JAVA定義變量與輸出詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot整合RabbitMQ 手動應(yīng)答(簡單demo)

    SpringBoot整合RabbitMQ 手動應(yīng)答(簡單demo)

    這篇文章主要介紹了SpringBoot整合RabbitMQ 手動應(yīng)答 簡單demo,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組

    Java如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組

    這篇文章主要介紹了Java如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺談SpringBoot2.3 新特配置文件屬性跟蹤

    淺談SpringBoot2.3 新特配置文件屬性跟蹤

    這篇文章主要介紹了淺談SpringBoot2.3 新特配置文件屬性跟蹤,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評論

大庆市| 香格里拉县| 黄平县| 武汉市| 蚌埠市| 车致| 元氏县| 临城县| 南城县| 汉川市| 平邑县| 长汀县| 宁城县| 宽甸| 西乡县| 柳州市| 南乐县| 凌海市| 宁蒗| 波密县| 滕州市| 珲春市| 务川| 平和县| 台湾省| 松滋市| 梁河县| 弋阳县| 祁连县| 瑞安市| 湟中县| 西城区| 武隆县| 磴口县| 京山县| 洪雅县| 昌图县| 凤台县| 泰宁县| 灌阳县| 合山市|