一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解SpringBoot中的異步調(diào)用@Async

詳解SpringBoot中的異步調(diào)用@Async

2021-03-29 23:50java小當(dāng)家 Java教程

本篇帶給大家SpringBoot中的異步調(diào)用@Async,在SpringBoot中,只需要給方法加上@Async注解,就能將同步方法變?yōu)楫惒秸{(diào)用。

詳解SpringBoot中的異步調(diào)用@Async

如何開(kāi)啟異步調(diào)用

 

SpringBoot中,只需要給方法加上@Async注解,就能將同步方法變?yōu)楫惒秸{(diào)用。

首先在啟動(dòng)類上添加@EnableAsync,即開(kāi)啟異步調(diào)用。

  1. /** 
  2.  * @author qcy 
  3.  */ 
  4. @SpringBootApplication 
  5. @EnableAsync 
  6. public class AsyncApplication { 
  7.  
  8.     public static void main(String[] args) { 
  9.         SpringApplication.run(AsyncApplication.class, args); 
  10.     } 
  11.  

在需要異步調(diào)用的方法上加上@Async注解

  1. package com.yang.async; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.scheduling.annotation.Async; 
  5. import org.springframework.scheduling.annotation.AsyncResult; 
  6. import org.springframework.stereotype.Component; 
  7.  
  8. import java.util.concurrent.Future; 
  9. import java.util.concurrent.FutureTask; 
  10.  
  11. /** 
  12.  * @author qcy 
  13.  * @create 2020/09/09 14:01:35 
  14.  */ 
  15. @Slf4j 
  16. @Component 
  17. public class Task { 
  18.  
  19.     @Async 
  20.     public void method1() { 
  21.         log.info("method1開(kāi)始,執(zhí)行線程為" + Thread.currentThread().getName()); 
  22.         try { 
  23.             Thread.sleep(2000); 
  24.         } catch (InterruptedException e) { 
  25.             e.printStackTrace(); 
  26.         } 
  27.         log.info("method1結(jié)束"); 
  28.     } 
  29.  
  30.     @Async 
  31.     public void method2() { 
  32.         log.info("method2開(kāi)始,執(zhí)行線程為" + Thread.currentThread().getName()); 
  33.         try { 
  34.             Thread.sleep(3000); 
  35.         } catch (InterruptedException e) { 
  36.             e.printStackTrace(); 
  37.         } 
  38.         log.info("method2結(jié)束"); 
  39.     } 
  40.  
  41.  

測(cè)試一下:

  1. @SpringBootTest 
  2. @Slf4j 
  3. public class AsyncApplicationTests { 
  4.  
  5.     @Autowired 
  6.     Task task; 
  7.  
  8.     @Test 
  9.     public void testAsyncWithVoidReturn() throws InterruptedException { 
  10.         log.info("main線程開(kāi)始"); 
  11.  
  12.         task.method1(); 
  13.         task.method2(); 
  14.  
  15.         //確保兩個(gè)異步調(diào)用執(zhí)行完成 
  16.         Thread.sleep(6000); 
  17.  
  18.         log.info("main線程結(jié)束"); 
  19.     } 
  20.  

輸出如下:

詳解SpringBoot中的異步調(diào)用@Async

可以看得出,SpringBoot創(chuàng)建了一個(gè)名為applicationTaskExecutor的線程池,使用這里面的線程來(lái)執(zhí)行異步調(diào)用。

這里值得注意的是,不要在一個(gè)類中調(diào)用@Async標(biāo)注的方法,否則不會(huì)起到異步調(diào)用的作用,至于為什么會(huì)產(chǎn)生這樣的問(wèn)題,需要深入到源碼中一探究竟,會(huì)另開(kāi)篇幅。

既然默認(rèn)使用的是SpringBoot自己創(chuàng)建的applicationTaskExecutor,那如何自己去定義一個(gè)線程池呢?

自定義線程池

 

我們需要手動(dòng)創(chuàng)建一個(gè)名為asynTaskExecutord的Bean

  1. package com.yang.async; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.context.annotation.Bean; 
  5. import org.springframework.context.annotation.Configuration; 
  6. import org.springframework.core.task.AsyncTaskExecutor; 
  7. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 
  8.  
  9. import java.util.concurrent.ThreadPoolExecutor; 
  10.  
  11. /** 
  12.  * @author qcy 
  13.  * @create 2020/09/09 15:31:07 
  14.  */ 
  15. @Slf4j 
  16. @Configuration 
  17. public class AsyncConfig { 
  18.  
  19.     @Bean 
  20.     public AsyncTaskExecutor asyncTaskExecutor() { 
  21.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  22.         executor.setCorePoolSize(8); 
  23.         executor.setMaxPoolSize(16); 
  24.         executor.setQueueCapacity(50); 
  25.         executor.setAllowCoreThreadTimeOut(true); 
  26.         executor.setKeepAliveSeconds(10); 
  27.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
  28.         executor.setThreadNamePrefix("async-thread-pool-thread"); 
  29.         return executor; 
  30.     } 

對(duì)以上參數(shù)不了解的同學(xué),可以參考我的這篇文章說(shuō)說(shuō)線程池

其他類不需要變動(dòng),直接運(yùn)行剛才的testAsyncWithVoidReturn()方法,輸出:

詳解SpringBoot中的異步調(diào)用@Async

看得出來(lái),現(xiàn)在是我們自定義的線程池

如果關(guān)心異步調(diào)用的返回值,又怎么處理?

獲取異步調(diào)用的返回結(jié)果

 

獲取異步調(diào)用的結(jié)果,需要利用Future機(jī)制,可以參考我的另外一篇文章談?wù)凴unnable、Future、Callable、FutureTask之間的關(guān)系

為Task類增加以下兩個(gè)方法:

  1. @Async 
  2.   public Future<String> method3() { 
  3.       log.info("method3開(kāi)始,執(zhí)行線程為" + Thread.currentThread().getName()); 
  4.       try { 
  5.           Thread.sleep(1000); 
  6.       } catch (InterruptedException e) { 
  7.           e.printStackTrace(); 
  8.       } 
  9.       log.info("method3結(jié)束"); 
  10.       return new AsyncResult<>("method3"); 
  11.   } 
  12.  
  13.   @Async 
  14.   public Future<String> method4() { 
  15.       log.info("method4開(kāi)始,執(zhí)行線程為" + Thread.currentThread().getName()); 
  16.       try { 
  17.           Thread.sleep(3000); 
  18.       } catch (InterruptedException e) { 
  19.           e.printStackTrace(); 
  20.       } 
  21.       log.info("method4結(jié)束"); 
  22.       return new AsyncResult<>("method4"); 
  23.   } 

測(cè)試類:

  1. @Test 
  2.   public void testAsyncWithStringReturn() throws InterruptedException, ExecutionException { 
  3.       log.info("main線程開(kāi)始"); 
  4.  
  5.       Future<String> method3Result = task.method3(); 
  6.       Future<String> method4Result = task.method4(); 
  7.  
  8.       //get方法為阻塞獲取 
  9.       log.info("method3執(zhí)行的返回結(jié)果:{}", method3Result.get()); 
  10.       log.info("method4執(zhí)行的返回結(jié)果:{}", method4Result.get()); 
  11.       log.info("main線程結(jié)束"); 
  12.   } 

輸出:

詳解SpringBoot中的異步調(diào)用@Async

如圖,在主線程結(jié)束前,獲取到了異步調(diào)用的結(jié)果。且在兩個(gè)異步調(diào)用都結(jié)束的情況下,繼續(xù)執(zhí)行主線程。

原文地址:https://www.toutiao.com/i6944877804123079207/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区精品 | 成年人免费看的视频 | 日本无翼乌漫画 | 久久永久视频 | 韩国靠逼 | 我与恶魔的h生活ova | 精品午夜久久福利大片免费 | 和老外3p爽粗大免费视频 | 日韩亚洲欧美一区二区三区 | a一区二区三区视频 | 欧美日韩国产一区二区三区伦 | 蜜柚精彩在线观看 | 亚洲国产高清一区二区三区 | 色老板免费在线观看 | 五月婷婷在线免费观看 | 国产99青草全福视在线 | 日韩精品中文字幕久久 | 免费大片a一级一级 | 无码乱人伦一区二区亚洲一 | 无码国产成人午夜在线观看不卡 | 日本中文字幕不卡在线一区二区 | 三级欧美在线 | 麻豆找网服| 2021最新国产成人精品视频 | 日韩欧美中文在线 | 国产一卡 | 欧美综合精品一区二区三区 | 爽好紧别夹宝贝叫大声点护士 | 亚洲国产福利精品一区二区 | 久久黄色大片 | 免费一区二区 | 日本成熟老妇xxxx | 亚洲成人网导航 | 毛片在线观看网站 | 四虎最新永久在线精品免费 | 91啪在线观看国产在线 | 婷婷99av综合 | 99re这里都是精品 | 国产一区二区三区日韩 | 暖暖视频免费观看视频中国.韩剧 | 国产18在线 |