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

Spring:@Async注解和AsyncResult與CompletableFuture使用問題

 更新時間:2024年08月21日 15:53:39   作者:?abc!  
這篇文章主要介紹了Spring:@Async注解和AsyncResult與CompletableFuture使用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

@Async概述

Spring中用@Async注解標(biāo)記的方法,稱為異步方法,它會在調(diào)用方的當(dāng)前線程之外的獨立的線程中執(zhí)行,

其實就相當(dāng)于我們自己

new Thread(()-> System.out.println("hello world !"))

這樣在另一個線程中去執(zhí)行相應(yīng)的業(yè)務(wù)邏輯

異步方法實際的執(zhí)行交給了 Spring 的 TaskExecutor 來完成。

@Async使用

  • @Async注解如果用在類的方法上,則說明改方法是異步方法
  • @Async注解如果用在類上,那么這個類所有的方法都是異步執(zhí)行的
  • @Async注解方法的類對象應(yīng)該是Spring容器管理的bean對象
  • 調(diào)用異步方法類上需要配置上注解@EnableAsync,或者是在啟動類上加上@EnableAsync

@Async注意

  • 默認情況下(@EnableAsync注解的mode=AdviceMode.PROXY),同一個類內(nèi)部沒有使用@Async注解修飾的方法調(diào)用@Async注解修飾的方法,是不會異步執(zhí)行的
  • 如果想實現(xiàn)類內(nèi)部自調(diào)用也可以異步,則需要切換@EnableAsync注解的mode=AdviceMode.ASPECTJ
  • 任意參數(shù)類型都是支持的,但是方法返回值必須是void或者Future類型

@Async代碼示例

使用1代碼實現(xiàn):調(diào)用異步方法類上配置@EnableAsync

import org.springframework.scheduling.annotation.Async;
 
public interface TestService {
    @Async
    void test();
}
import com.example.service.TestService;
import org.springframework.stereotype.Service;
 
@Service
public class TestServiceImpl implements TestService {
    @Override
    public void test() {
        //...
    }
}

調(diào)用異步方法的controller類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.*;
 
 
@RestController
@RequestMapping(value = "/test")
@EnableAsync
public class TestContoller {
 
    @Autowired
    private TestService testService;
 
    @GetMapping(value = "/testAsync")
    public void print() {
       testService.test();
    }
}

如果我們?nèi)コ齌estController上的@EnableAsync或者new 一個TestService對象(該對象沒有加載進Spring的容器中),那么TestController中的print()方法都會同步執(zhí)行,后臺打印日志也可以看到只有一個線程在執(zhí)行

使用2代碼實現(xiàn):在啟動類上配置@EnableAsync

如果啟動類上配置@EnableAsync,那么在上例代碼中,便不需要再在Controller上面加上@EnableAsync這個注解

入口類增加了 @EnableAsync 注解,主要是為了掃描范圍包下的所有 @Async 注解。

注意1代碼實現(xiàn):@Async沒有生效

@Async 修飾test()方法,test2()方法不修飾

public interface TestService {
    @Async
    void test();
 
    void test2();
}
public class TestServiceImpl implements TestService{
    @Override
    public void test() {
        //...
    }
 
    @Override
    public void test2() {
        test();//自調(diào)用test()方法
    }
}

這種情況下“:test2()方法調(diào)用的test()方法并沒有異步執(zhí)行,只有一個線程

AsyncResult

Spring中提供了一個 Future 接口的子類:AsyncResult,所以我們可以返回 AsyncResult 類型的值。

AsyncResult是異步方式,異步主要用于調(diào)用的代碼需要長時間運行,才能返回結(jié)果的時候,可以不阻塞調(diào)用者

public class AsyncResult<V> implements ListenableFuture<V> {
    private final V value;
    private final ExecutionException executionException;
    //...
}

AsyncResult實現(xiàn)了ListenableFuture接口,該對象內(nèi)部有兩個屬性:返回值和異常信息。

public interface ListenableFuture<T> extends Future<T> {
    void addCallback(ListenableFutureCallback<? super T> var1);
    void addCallback(SuccessCallback<? super T> var1, FailureCallback var2);
}

AsyncResult代碼示例

獲取異步方法返回值的實現(xiàn):返回String

public Future<String> test() throws Exception {
        log.info("開始做任務(wù)");
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        log.info("完成任務(wù),耗時:" + (end - start) + "毫秒");
        return new AsyncResult<>("任務(wù)完成,耗時" + (end - start) + "毫秒");
}

返回自定義類型的話,在上面的Future里面的String改為對應(yīng)的實體類

CompletableFuture

統(tǒng)計一下三個任務(wù)并發(fā)執(zhí)行共耗時多少,這就需要等到上述三個函數(shù)都完成調(diào)動之后記錄時間,并計算結(jié)果。

也可以使用CompletableFuture來返回異步調(diào)用的結(jié)果

  • 通過CompletableFuture.allOf(task1, task2, task3).join()實現(xiàn)三個異步任務(wù)都結(jié)束之前的阻塞效果
  • 三個任務(wù)都完成之后,根據(jù)結(jié)束時間 - 開始時間,計算出三個任務(wù)并發(fā)執(zhí)行的總耗時。

CompletableFuture代碼示例

@Async
public CompletableFuture<String> doTaskOne() throws Exception {
    log.info("開始做任務(wù)一");
    long start = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    long end = System.currentTimeMillis();
    log.info("完成任務(wù)一,耗時:" + (end - start) + "毫秒");
    return CompletableFuture.completedFuture("任務(wù)一完成");
}
@Test
public void test() throws Exception {
    long start = System.currentTimeMillis();
    CompletableFuture<String> task1 = asyncTasks.test();
    CompletableFuture<String> task2 = asyncTasks.test();
    CompletableFuture<String> task3 = asyncTasks.test();
    CompletableFuture.allOf(task1, task2, task3).join();
    long end = System.currentTimeMillis();
    log.info("任務(wù)全部完成,總耗時:" + (end - start) + "毫秒");
}

線程池配置

自行谷歌或百度,spring線程池配置,基本上很詳細了

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Cloud?Hystrix原理與注意事項小結(jié)

    Spring?Cloud?Hystrix原理與注意事項小結(jié)

    本文介紹了Hystrix的基本概念、工作原理以及其在實際開發(fā)中的應(yīng)用方式,通過對Hystrix的深入學(xué)習(xí),開發(fā)者可以在分布式系統(tǒng)中實現(xiàn)精細的錯誤處理機制,并能夠及時響應(yīng)系統(tǒng)中的異常,避免服務(wù)的連鎖崩潰,感興趣的朋友一起看看吧
    2025-03-03
  • 詳解Java如何優(yōu)雅地書寫if-else

    詳解Java如何優(yōu)雅地書寫if-else

    在日常開發(fā)中我們常常遇到有多個if?else的情況,之間書寫顯得代碼冗余難看,對于追求更高質(zhì)量代碼的同學(xué),就會思考如何優(yōu)雅地處理這種代碼。本文我們就來探討下幾種優(yōu)化if?else的方法
    2022-08-08
  • Springboot消除switch-case過程解析

    Springboot消除switch-case過程解析

    這篇文章主要介紹了Springboot消除switch-case過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • 基于springEL表達式詳解及應(yīng)用

    基于springEL表達式詳解及應(yīng)用

    這篇文章主要介紹了springEL表達式詳解及應(yīng)用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java Pattern和Matcher字符匹配方式

    Java Pattern和Matcher字符匹配方式

    這篇文章主要介紹了Java Pattern和Matcher字符匹配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 你應(yīng)該知道的21個Java核心技術(shù)

    你應(yīng)該知道的21個Java核心技術(shù)

    Java的21個核心技術(shù)點,你知道嗎?這篇文章主要為大家詳細介紹了Java核心技術(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 利用openoffice+jodconverter-code-3.0-bate4實現(xiàn)ppt轉(zhuǎn)圖片

    利用openoffice+jodconverter-code-3.0-bate4實現(xiàn)ppt轉(zhuǎn)圖片

    這篇文章主要為大家詳細介紹了利用openoffice+jodconverter-code-3.0-bate4實現(xiàn)ppt轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java依賴注入容器超詳細全面講解

    Java依賴注入容器超詳細全面講解

    依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當(dāng)某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在 傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例
    2023-01-01
  • java中ArrayList的兩種排序方法實例

    java中ArrayList的兩種排序方法實例

    ArrayList是一個數(shù)組隊列,相當(dāng)于 動態(tài)數(shù)組,與Java中的數(shù)組相比,它的容量能動態(tài)增長,這篇文章主要給大家介紹了關(guān)于java中ArrayList的兩種排序方法,需要的朋友可以參考下
    2021-07-07
  • Springboot配置文件相關(guān)語法及讀取方式詳解

    Springboot配置文件相關(guān)語法及讀取方式詳解

    本文主要介紹了Spring Boot中的兩種配置文件形式,即.properties文件和.yml/.yaml文件,詳細講解了這兩種文件的語法和讀取方式,同時,還介紹了使用@ConfigurationProperties注解和Environment接口讀取配置文件的方法,并提供了具體的讀取示例
    2025-12-12

最新評論

阳新县| 鹤岗市| 石景山区| 台前县| 新乡县| 沙坪坝区| 金沙县| 阿瓦提县| 监利县| 嵊泗县| 孝义市| 谢通门县| 裕民县| 盐山县| 石屏县| 闸北区| 年辖:市辖区| 博爱县| 岑巩县| 湘潭市| 柘城县| 永川市| 宽城| 岳阳县| 金溪县| 类乌齐县| 天全县| 碌曲县| 三门县| 古蔺县| 遵化市| 永嘉县| 福州市| 梅州市| 肃宁县| 嘉峪关市| 华亭县| 习水县| 民县| 黎川县| 略阳县|