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

關(guān)于java中@Async異步調(diào)用詳細(xì)解析附代碼

 更新時(shí)間:2022年07月14日 08:48:31   作者:碼農(nóng)研究僧  
本文主要介紹了java關(guān)于@Async異步調(diào)用詳細(xì)解析附代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

異步調(diào)用與同步調(diào)用

  • 同步調(diào)用:順序執(zhí)行,通過調(diào)用返回結(jié)果再次執(zhí)行下一個(gè)調(diào)用
  • 異步調(diào)用:通過調(diào)用,無需等待返回結(jié)果,執(zhí)行下一個(gè)調(diào)用

1. @Async講解

其@Async的注解代碼如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
    String value() default "";
}

注解可以使用在類型以及方法中
通過value定義其值,默認(rèn)是空

一般這個(gè)注解需要配合@EnableAsync,起源碼如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AsyncConfigurationSelector.class})
public @interface EnableAsync {
? ? Class<? extends Annotation> annotation() default Annotation.class;

? ? boolean proxyTargetClass() default false;

? ? AdviceMode mode() default AdviceMode.PROXY;

? ? int order() default Integer.MAX_VALUE;
}

主要通過該注解放置在啟動(dòng)類中進(jìn)行配置啟動(dòng)

在啟動(dòng)類中添加如下:

@SpringbootApplication
@EnableAsync
public class Application{
    public static void main(String[] args){
        SrpingApplication.run(Application.class, args);
    }
}

2. 用法

2.1 同步調(diào)用

從調(diào)用到返回函數(shù)結(jié)果才能執(zhí)行下一步,稱為同步調(diào)用

service層 代碼:

public class Service{
    public void test01() throws InterruptedException{
        Thread.sleep(5000);
        System.out.println("保存日志");
    }
}

控制層代碼模塊:

public class Controler{
?? ?@Autowired
?? ?private Service service;

?? ?@GetMapping("/test")
?? ?public String getTest(){
?? ??? ?try{
?? ??? ??? ?System.out.println("開始");
?? ??? ??? ?service.test01();
?? ??? ??? ?System.out.println("結(jié)束");?? ??? ??? ?
?? ??? ?}catch(InterruptedException e){
?? ??? ??? ?e.prinStackTrace();
?? ??? ?}
?? ?}
?? ?
}

通過springboot的啟動(dòng)類啟動(dòng)之后

輸出如下:

開始

// 此為等待5秒鐘,終端不顯示也不關(guān)閉

結(jié)束

2.2 異步調(diào)用

異步調(diào)用,執(zhí)行函數(shù)不用等返回結(jié)果就可以執(zhí)行下一步

service層 代碼:
主要是添加了@Async注解標(biāo)識(shí)這個(gè)方法

public class Service{
    @Async
    public void test01() throws InterruptedException{
        Thread.sleep(500);
        System.out.println("保存日志");
    }
}

控制層代碼模塊:

通過調(diào)用service層函數(shù)

public class Controler{
?? ?@Autowired
?? ?private Service service;

?? ?@GetMapping("/test")
?? ?public String getTest(){
?? ??? ?try{
?? ??? ??? ?System.out.println("開始");
?? ??? ??? ?service.test01();
?? ??? ??? ?System.out.println("結(jié)束");?? ??? ??? ?
?? ??? ?}catch(InterruptedException e){
?? ??? ??? ?e.prinStackTrace();
?? ??? ?}
?? ?}
?? ?
}

以及在啟動(dòng)類中加入注解啟動(dòng) @EnableAsync

@SpringbootApplication
@EnableAsync
public class Application{
    public static void main(String[] args){
        SrpingApplication.run(Application.class, args);
    }
}

3. 自定義線程池

對于線程池的一些基本知識(shí)可看我之前的文章:

java如何正確關(guān)閉線程以及線程池(代碼實(shí)踐含源碼分析)
java線程池的創(chuàng)建方式詳細(xì)分析(全)

如果不指定線程池,默認(rèn)使用的線程池為SimpleAsyncTaskExecutor(來一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,不斷創(chuàng)建線程導(dǎo)致CPU過高引發(fā)OOM),自帶的線程池一般都有弊端,一般推薦使用ThreadPoolExecutor(明確線程池的資源,規(guī)避風(fēng)險(xiǎn))

具體如下:

  • newFixedThreadPool:定死了線程數(shù),任務(wù)隊(duì)列還是無界的,(最大線程數(shù)只有隊(duì)列滿了,最大線程數(shù)才會(huì)創(chuàng)建),所以會(huì)造成OOM
  • newCachedThreadPool:沒有設(shè)置最大線程數(shù)上限,創(chuàng)建大量的線程容易卡頓或者直接OOM

通過自定義線程池可以調(diào)整線程池的配置,更好的資源利用

@Async這個(gè)注解查找 AsyncConfigurer接口(實(shí)現(xiàn)類為AsyncConfigurerSupport,默認(rèn)配置和方法都是空),所以可重寫接口指定線程池。

  • 通過實(shí)現(xiàn)接口AsyncConfigurer
  • 繼承AsyncConfigurerSupport
  • 自定義TaskExecutor(替代內(nèi)置任務(wù)執(zhí)行器)

第三種方法:

在application.xml中定義線程池的一些變量

thread.core.size=16
thread.max.size=16
thread.queue.size=30

thread.prefix=xx-

自定義線程池如下

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ThreadPoolConfig {
?? ?// 線程名稱前綴
? ? @Value("${thread.prefix}")
? ? private String threadPrefix;
?? ?
?? ?// 核心線程數(shù)
? ? @Value("${thread.core.size}")
? ? private int coreSize;

?? ?// 最大線程數(shù)
? ? @Value("${thread.max.size}")
? ? private int maxSize;
?? ?
?? ?// 隊(duì)列長度
? ? @Value("${thread.queue.size}")
? ? private int queueSize;
?? ?
?? ?// 通過bean注解注入
? ? @Bean("xx")
? ? public ThreadPoolTaskExecutor taskExecutor() {
? ? ? ? ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
? ? ? ? //設(shè)置線程池參數(shù)信息
? ? ? ? taskExecutor.setCorePoolSize(coreSize);
? ? ? ? taskExecutor.setMaxPoolSize(maxSize);
? ? ? ? taskExecutor.setQueueCapacity(queueSize);
? ? ? ? taskExecutor.setThreadNamePrefix(threadPrefix);
? ? ? ? taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
? ? ? ? taskExecutor.setAwaitTerminationSeconds(30);
? ? ? ??
? ? ? ? //修改拒絕策略為使用當(dāng)前線程執(zhí)行
? ? ? ? taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
? ? ? ??
? ? ? ? //初始化線程池
? ? ? ? taskExecutor.initialize();
? ? ? ? return taskExecutor;
? ? }
}

到此這篇關(guān)于關(guān)于java中@Async異步調(diào)用詳細(xì)解析附代碼的文章就介紹到這了,更多相關(guān)java @Async異步調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中@RequestMapping、@PostMapping、@GetMapping的實(shí)現(xiàn)

    Spring中@RequestMapping、@PostMapping、@GetMapping的實(shí)現(xiàn)

    RequestMapping、@PostMapping和@GetMapping是三個(gè)非常常用的注解,本文就來介紹一下這三種注解的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • java讀取文件里面部分漢字內(nèi)容亂碼的解決方案

    java讀取文件里面部分漢字內(nèi)容亂碼的解決方案

    這篇文章主要介紹了java讀取文件里面部分漢字內(nèi)容亂碼的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot自定義啟動(dòng)器Starter流程詳解

    SpringBoot自定義啟動(dòng)器Starter流程詳解

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾
    2022-11-11
  • 如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題

    如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題

    這篇文章主要介紹了如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java下載項(xiàng)目中靜態(tài)文件方式

    Java下載項(xiàng)目中靜態(tài)文件方式

    這篇文章主要介紹了Java下載項(xiàng)目中靜態(tài)文件方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn)

    SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn)

    Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,這篇文章主要介紹了SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn),需要的朋友可以參考下
    2024-08-08
  • 通過Docker啟動(dòng)Solace并在Spring?Boot通過JMS整合Solace的操作方法

    通過Docker啟動(dòng)Solace并在Spring?Boot通過JMS整合Solace的操作方法

    本文將介紹如何在Spring中使用,雖然代碼使用的是Spring Boot,但并沒有使用相關(guān)starter,跟Spring的整合一樣,可通用,JMS是通過的消息處理框架,可以深入學(xué)習(xí)一下,不同的MQ在JMS的整合上都是類似的,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • 一定要讓你搞懂Java位運(yùn)算符

    一定要讓你搞懂Java位運(yùn)算符

    這篇文章主要為大家介紹了Java位運(yùn)算符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java?阻塞隊(duì)列BlockingQueue詳解

    Java?阻塞隊(duì)列BlockingQueue詳解

    本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實(shí)例代碼介紹了Java?阻塞隊(duì)列BlockingQueue的相關(guān)知識(shí),需要的朋友可以參考下
    2022-06-06
  • Spring自定義注解配置簡單日志示例

    Spring自定義注解配置簡單日志示例

    這篇文章主要介紹了Spring自定義注解配置簡單日志示例,注解可以增強(qiáng)我們的java代碼,同時(shí)利用反射技術(shù)可以擴(kuò)充實(shí)現(xiàn)很多功能,它們被廣泛應(yīng)用于三大框架底層,需要的朋友可以參考下
    2023-05-05

最新評論

巨野县| 西峡县| 文昌市| 甘德县| 永兴县| 吴堡县| 区。| 临朐县| 珠海市| 隆回县| 金平| 拉萨市| 南宁市| 宝清县| 昆山市| 合作市| 基隆市| 南岸区| 宁陵县| 榆林市| 曲阜市| 漯河市| 杂多县| 屏南县| 靖边县| 灵丘县| 禹州市| 祥云县| 铁岭县| 南乐县| 商南县| 久治县| 新绛县| 富锦市| 鄱阳县| 宣恩县| 东丰县| 新干县| 扶绥县| 饶平县| 河西区|