欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中使用多線程的方法示例

 更新時(shí)間:2021年03月17日 09:32:39   作者:BouncingFish  
這篇文章主要介紹了SpringBoot中使用多線程的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、介紹

Spring是通過任務(wù)執(zhí)行器(TaskExecutor)來實(shí)現(xiàn)多線程和并發(fā)編程,使用Spring提供的ThreadPoolTaskExecutor來創(chuàng)建一個(gè)基于線城池的TaskExecutor。在使用線程池的大多數(shù)情況下都是異步非阻塞的。節(jié)省更多的時(shí)間,提高效率。

工作原理

當(dāng)主線程中調(diào)用execute接口提交執(zhí)行任務(wù)時(shí):則執(zhí)行以下步驟:注意:線程池初始時(shí),是空的。

  • 如果當(dāng)前線程數(shù)<corePoolSize,如果是則創(chuàng)建新的線程執(zhí)行該任務(wù)
  • 如果當(dāng)前線程數(shù)>=corePoolSize,則將任務(wù)存入BlockingQueue
  • 如果阻塞隊(duì)列已滿,且當(dāng)前線程數(shù)<maximumPoolSize,則新建線程執(zhí)行該任務(wù)。
  • 如果阻塞隊(duì)列已滿,且當(dāng)前線程數(shù)>=maximumPoolSize,則拋出異常RejectedExecutionException,告訴調(diào)用者無法再接受任務(wù)了。

在Springboot中對(duì)其進(jìn)行了簡(jiǎn)化處理,只需要配置一個(gè)類型為java.util.concurrent.TaskExecutor或其子類的bean,并在配置類或直接在程序入口類上聲明注解@EnableAsync,即可可以開啟異步任務(wù)。

調(diào)用也簡(jiǎn)單,在由Spring管理的對(duì)象的方法上標(biāo)注注解@Async,聲明是異步任務(wù),顯式調(diào)用即可生效。

二、聲明

讓配置類實(shí)現(xiàn)AsyncConfigurer接口,并重寫getAsyncExecutor方法,并返回一個(gè)ThreasPoolTaskExecutor,就可以獲取一個(gè)基于線程池的TaskExecutor
使用注解@EnableAsync開啟異步,會(huì)自動(dòng)掃描

@Configuration
@EnableAsync
public class ThreadConfig implements AsyncConfigurer {

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(15);
    executor.setQueueCapacity(25);
    executor.initialize();
    return executor;
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return null;
  }
}

三、調(diào)用

通過@Async注解表明該方法是異步方法,如果注解在類上,那表明這個(gè)類里面的所有方法都是異步的

@Service
public class AsyncTaskService {

  @Async
  public void executeAsyncTask(int i) {
    System.out.println("線程" + Thread.currentThread().getName() + " 執(zhí)行異步任務(wù):" + i);
  }

}

四、進(jìn)階

有時(shí)候我們不止希望異步執(zhí)行任務(wù),還希望任務(wù)執(zhí)行完成后會(huì)有一個(gè)返回值,在java中提供了Future泛型接口,用來接收任務(wù)執(zhí)行結(jié)果,springboot也提供了此類支持,使用實(shí)現(xiàn)了ListenableFuture接口的類如AsyncResult來作為返回值的載體。比如上例中,我們希望返回一個(gè)類型為String類型的值,可以將返回值改造為:

  @Async
  public Future<String> executeAsyncTaskWithResult2(int i) {
    System.out.println("線程" + Thread.currentThread().getName() + " 開始執(zhí)行異步任務(wù)" + i);
    try {
      Thread.sleep(10000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("線程" + Thread.currentThread().getName() + " 結(jié)束執(zhí)行異步任務(wù)" + i);
    return new AsyncResult<>("線程" + Thread.currentThread().getName() + " 執(zhí)行異步任務(wù):" + i);
  }

調(diào)用返回值:
get()是阻塞式,等待當(dāng)前線程完成才返回值

  public void threadTest() {
    try {
      List<Future> futures = new ArrayList<>();
      for (int i = 0; i < 20; i++) {
        futures.add(asyncTaskService.executeAsyncTaskWithResult2(i));
      }
      // 獲取值。get是阻塞式,等待當(dāng)前線程完成才返回值
      for (Future<String> future : futures) {
        System.out.println("返回結(jié)果:" + future.get());
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }
  }

補(bǔ)充

實(shí)際上,@Async還有一個(gè)參數(shù),通過Bean名稱來指定調(diào)用的線程池-比如上例中設(shè)置的線程池參數(shù)不滿足業(yè)務(wù)需求,可以另外定義合適的線程池,調(diào)用時(shí)指明使用這個(gè)線程池-缺省時(shí)springboot會(huì)優(yōu)先使用名稱為'taskExecutor'的線程池,如果沒有找到,才會(huì)使用其他類型為TaskExecutor或其子類的線程池。

到此這篇關(guān)于SpringBoot中使用多線程的方法示例的文章就介紹到這了,更多相關(guān)SpringBoot使用多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb 實(shí)現(xiàn)驗(yàn)證碼功能(demo)

    JavaWeb 實(shí)現(xiàn)驗(yàn)證碼功能(demo)

    在 WEB-APP 中一般應(yīng)用于:登錄、注冊(cè)、買某票、秒殺等場(chǎng)景,大家都接觸過這個(gè)驗(yàn)證碼操作,今天小編通過實(shí)例代碼給大家講解javaweb實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友參考下
    2017-02-02
  • java為什么需要虛擬機(jī)jvm原理詳解

    java為什么需要虛擬機(jī)jvm原理詳解

    這篇文章主要為大家介紹了java為什么需要虛擬機(jī)jvm的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java的動(dòng)態(tài)綁定與雙分派,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java經(jīng)典面試題之NIO多路復(fù)用

    Java經(jīng)典面試題之NIO多路復(fù)用

    JAVA?NIO?的多路復(fù)用是面試中經(jīng)常被問的問題,今天我們徹底搞明白究竟是怎么回事,文中的示例代碼講解詳細(xì),希望對(duì)大家學(xué)習(xí)Java有所幫助
    2023-06-06
  • 使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問題

    使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問題

    這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot最簡(jiǎn)潔的國際化配置

    SpringBoot最簡(jiǎn)潔的國際化配置

    這篇文章主要介紹了SpringBoot最簡(jiǎn)潔的國際化配置,Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用程序的框架,國際化是一個(gè)重要的功能,它允許應(yīng)用程序根據(jù)用戶的語言和地區(qū)顯示不同的內(nèi)容,在Spring Boot中,實(shí)現(xiàn)國際化非常簡(jiǎn)單,需要的朋友可以參考下
    2023-10-10
  • SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù)

    SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù)

    這篇文章主要介紹了SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • RocketMQ源碼本地搭建調(diào)試方法

    RocketMQ源碼本地搭建調(diào)試方法

    這篇文章主要介紹了RocketMQ源碼本地搭建調(diào)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • 淺析java中Pair和Map的區(qū)別

    淺析java中Pair和Map的區(qū)別

    這篇文章主要介紹了java中Pair和Map的區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問題

    java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問題

    這篇文章主要為大家介紹了java圖論弗洛伊德算法和迪杰斯特拉算法解決最短路徑的問題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評(píng)論