Spring——@Async

1.實(shí)現(xiàn)原理

Spring 通過任務(wù)執(zhí)行器(TaskExecutor)來實(shí)現(xiàn)多線程和并發(fā)編程

使用ThreadPoolTaskExecutor實(shí)現(xiàn)一個(gè)基于線程池的TaskExecutor

2.使用步驟

2.1 配置類

2.1.1使用@EnableAsync開啟異步任務(wù)支持;

2.1.2配置類需要實(shí)現(xiàn)AsyncConfigure接口并重寫getAsyncExecutor和getAsyncUncaughtExceptionHandler方法

2.2 任務(wù)執(zhí)行類

通過@Async注解表明這個(gè)方法是一個(gè)異步方法

3.demo

3.1配置類

@Configuration

@ComponentScan("com.xxx.springboot.springbootdemo")

@EnableAsync

public class TaskExecutorConfig implements AsyncConfigurer {

    @Override

    public Executor getAsyncExecutor(){

        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();

        taskExecutor.setCorePoolSize(5);

        taskExecutor.setMaxPoolSize(10);

        taskExecutor.setQueueCapacity(25);

        taskExecutor.initialize();

        return taskExecutor;

    }

    @Override

    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){

        return null;

    }

}

3.2任務(wù)執(zhí)行類

@Service

public class AsyncTaskService {

@Async

    public void executeAsyncTask1(Integer i){

System.out.println(Thread.currentThread().getName()+"執(zhí)行異步任務(wù)1:"+i);

    }

@Async

    public void executeAsyncTask2(Integer i){

System.out.println(Thread.currentThread().getName()+"執(zhí)行異步任務(wù)2:"+i);

    }

}

3.3 執(zhí)行

public static void main(String[] args) {

AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(TaskExecutorConfig.class);

AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

      for(int i=0;i<10;i++){

        asyncTaskService.executeAsyncTask1(i);

        asyncTaskService.executeAsyncTask2(i);

      }

context.close();

   }

3.4執(zhí)行結(jié)果

image

4.設(shè)置參數(shù)

Spring 中的ThreadPoolExecutor是借助JDK并發(fā)包中的java.util.concurrent.ThreadPoolExecutor來實(shí)現(xiàn)的。其中一些值的含義如下:

int corePoolSize:線程池維護(hù)線程的最小數(shù)量

int maximumPoolSize:線程池維護(hù)線程的最大數(shù)量,線程池中允許的最大線程數(shù),線程池中的當(dāng)前線程數(shù)目不會(huì)超過該值。如果隊(duì)列中任務(wù)已滿,并且當(dāng)前線程個(gè)數(shù)小于maximumPoolSize,那么會(huì)創(chuàng)建新的線程來執(zhí)行任務(wù)。

long keepAliveTime:空閑線程的存活時(shí)間TimeUnit unit:時(shí)間單位,現(xiàn)由納秒,微秒,毫秒,秒

BlockingQueue workQueue:持有等待執(zhí)行的任務(wù)隊(duì)列

RejectedExecutionHandler handler 線程池的拒絕策略,是指當(dāng)任務(wù)添加到線程池中被拒絕,而采取的處理措施。

當(dāng)任務(wù)添加到線程池中之所以被拒絕,可能是由于:第一,線程池異常關(guān)閉。第二,任務(wù)數(shù)量超過線程池的最大限制。

Reject策略預(yù)定義有四種:

(1)ThreadPoolExecutor.AbortPolicy策略,是默認(rèn)的策略,處理程序遭到拒絕將拋出運(yùn)行時(shí) RejectedExecutionException。

(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,調(diào)用者的線程會(huì)執(zhí)行該任務(wù),如果執(zhí)行器已關(guān)閉,則丟棄.

(3)ThreadPoolExecutor.DiscardPolicy策略,不能執(zhí)行的任務(wù)將被丟棄.

(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果執(zhí)行程序尚未關(guān)閉,則位于工作隊(duì)列頭部的任務(wù)將被刪除,然后重試執(zhí)行程序(如果再次失敗,則重復(fù)此過程).

【參考】

《JavaEE開發(fā)的顛覆者 SpringBoot實(shí)戰(zhàn)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf閱讀 392評(píng)論 0 1
  • 【JAVA 線程】 線程 進(jìn)程:是一個(gè)正在執(zhí)行中的程序。每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序。該順序是一個(gè)執(zhí)行路徑,或者...
    Rtia閱讀 2,894評(píng)論 2 20
  • 深入分析線程池 在前面的文章中,我們使用線程的時(shí)候就去創(chuàng)建一個(gè)線程,這樣實(shí)現(xiàn)起來非常簡(jiǎn)便,但是就會(huì)有一個(gè)問題: 如...
    史路比閱讀 507評(píng)論 0 1
  • 作者:海子原文地址:http://www.cnblogs.com/dolphin0520/ 前言 如果我們要使用線...
    l鹿貍i閱讀 647評(píng)論 0 1
  • 隨時(shí)隨地收發(fā)電子郵件,一個(gè)接一個(gè)地參加大小會(huì)議,在繁雜的多線程工作中不斷切換注意力,工作的同時(shí)還不忘用微信和朋友聯(lián)...
    李欣哲閱讀 2,005評(píng)論 1 7

友情鏈接更多精彩內(nèi)容