成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot使用@Async實現異步調用:自定義線程池

企業動態
本文中的例子我們可以在之前的例子基礎上修改,也可以創建一個全新的Spring Boot項目來嘗試。

本文中的例子我們可以在之前的例子基礎上修改,也可以創建一個全新的Spring Boot項目來嘗試。

[[233638]]

定義線程池

***步,先在Spring Boot主類中定義一個線程池,比如:

  1. @SpringBootApplication 
  2. public class Application { 
  3.  
  4.     public static void main(String[] args) { 
  5.         SpringApplication.run(Application.class, args); 
  6.     } 
  7.  
  8.     @EnableAsync 
  9.     @Configuration 
  10.     class TaskPoolConfig { 
  11.  
  12.         @Bean("taskExecutor"
  13.         public Executor taskExecutor() { 
  14.             ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  15.             executor.setCorePoolSize(10); 
  16.             executor.setMaxPoolSize(20); 
  17.             executor.setQueueCapacity(200); 
  18.             executor.setKeepAliveSeconds(60); 
  19.             executor.setThreadNamePrefix("taskExecutor-"); 
  20.             executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
  21.             return executor; 
  22.         } 
  23.     } 
  24.  

上面我們通過使用ThreadPoolTaskExecutor創建了一個線程池,同時設置了以下這些參數:

  • 核心線程數10:線程池創建時候初始化的線程數
  • ***線程數20:線程池***的線程數,只有在緩沖隊列滿了之后才會申請超過核心線程數的線程
  • 緩沖隊列200:用來緩沖執行任務的隊列
  • 允許線程的空閑時間60秒:當超過了核心線程出之外的線程在空閑時間到達之后會被銷毀
  • 線程池名的前綴:設置好了之后可以方便我們定位處理任務所在的線程池
  • 線程池對拒絕任務的處理策略:這里采用了CallerRunsPolicy策略,當線程池沒有處理能力的時候,該策略會直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務

使用線程池

在定義了線程池之后,我們如何讓異步調用的執行任務使用這個線程池中的資源來運行呢?方法非常簡單,我們只需要在@Async注解中指定線程池名即可,比如:

  1. @Slf4j 
  2. @Component 
  3. public class Task { 
  4.  
  5.     public static Random random = new Random(); 
  6.  
  7.     @Async("taskExecutor"
  8.     public void doTaskOne() throws Exception { 
  9.         log.info("開始做任務一"); 
  10.         long start = System.currentTimeMillis(); 
  11.         Thread.sleep(random.nextInt(10000)); 
  12.         long end = System.currentTimeMillis(); 
  13.         log.info("完成任務一,耗時:" + (end - start) + "毫秒"); 
  14.     } 
  15.  
  16.     @Async("taskExecutor"
  17.     public void doTaskTwo() throws Exception { 
  18.         log.info("開始做任務二"); 
  19.         long start = System.currentTimeMillis(); 
  20.         Thread.sleep(random.nextInt(10000)); 
  21.         long end = System.currentTimeMillis(); 
  22.         log.info("完成任務二,耗時:" + (end - start) + "毫秒"); 
  23.     } 
  24.  
  25.     @Async("taskExecutor"
  26.     public void doTaskThree() throws Exception { 
  27.         log.info("開始做任務三"); 
  28.         long start = System.currentTimeMillis(); 
  29.         Thread.sleep(random.nextInt(10000)); 
  30.         long end = System.currentTimeMillis(); 
  31.         log.info("完成任務三,耗時:" + (end - start) + "毫秒"); 
  32.     } 
  33.  

單元測試

***,我們來寫個單元測試來驗證一下

  1. @RunWith(SpringJUnit4ClassRunner.class) 
  2. @SpringBootTest 
  3. public class ApplicationTests { 
  4.  
  5.     @Autowired 
  6.     private Task task; 
  7.  
  8.     @Test 
  9.     public void test() throws Exception { 
  10.  
  11.         task.doTaskOne(); 
  12.         task.doTaskTwo(); 
  13.         task.doTaskThree(); 
  14.  
  15.         Thread.currentThread().join(); 
  16.     } 
  17.  

執行上面的單元測試,我們可以在控制臺中看到所有輸出的線程名前都是之前我們定義的線程池前綴名開始的,說明我們使用線程池來執行異步任務的試驗成功了!

  1. 2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-1] com.didispace.async.Task                 : 開始做任務一 
  2. 2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-2] com.didispace.async.Task                 : 開始做任務二 
  3. 2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-3] com.didispace.async.Task                 : 開始做任務三 
  4. 2018-03-27 22:01:18.165  INFO 73703 --- [ taskExecutor-2] com.didispace.async.Task                 : 完成任務二,耗時:2545毫秒 
  5. 2018-03-27 22:01:22.149  INFO 73703 --- [ taskExecutor-3] com.didispace.async.Task                 : 完成任務三,耗時:6529毫秒 
  6. 2018-03-27 22:01:23.912  INFO 73703 --- [ taskExecutor-1] com.didispace.async.Task                 : 完成任務一,耗時:8292毫秒 

完整示例:

讀者可以根據喜好選擇下面的兩個倉庫中查看Chapter4-1-3項目:

Github:https://github.com/dyc87112/SpringBoot-Learning/

Gitee:https://gitee.com/didispace/SpringBoot-Learning/

【本文為51CTO專欄作者“翟永超”的原創稿件,轉載請通過51CTO聯系作者獲取授權】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-09-28 14:54:07

Spring注解方式線程池

2024-08-12 10:13:01

2024-07-31 15:57:41

2024-10-15 10:28:43

2021-03-29 09:26:44

SpringBoot異步調用@Async

2020-01-02 16:30:02

Spring BootJava異步請求

2024-06-13 00:54:19

2024-10-14 17:18:27

2009-11-09 10:50:30

WCF異步調用

2022-09-27 12:01:56

Spring異步調用方式

2016-08-18 13:56:33

AndroidExecutorsubmit

2017-08-03 17:00:54

Springmvc任務執行器

2010-03-18 16:19:02

Java自定義線程池

2013-01-09 17:22:38

Android開發Camera

2009-08-21 11:24:16

C#異步調用

2009-07-01 14:37:14

JavaScript異

2009-07-01 14:23:46

JavaScript異

2009-10-13 09:56:13

.NET多線程程序

2010-02-25 09:13:34

WCF異步調用

2009-10-20 16:48:30

C#委托
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线免费视频 | 国产精品国产三级国产aⅴ原创 | 久久久.com | 狠狠婷婷综合久久久久久妖精 | 亚洲性视频网站 | 6996成人影院网在线播放 | 九九热精品在线 | 国产精品久久久久久久久久 | 一区二区免费在线视频 | 国产成人99久久亚洲综合精品 | 九九热国产精品视频 | 黄色一级大片在线免费看产 | 精品国产乱码久久久久久丨区2区 | www.国产精品| 欧美精品一区在线 | 欧美一级欧美一级在线播放 | 精品在线一区二区 | 亚洲精品欧美一区二区三区 | 亚洲精品在线免费播放 | 久久久xx| 国产精品jizz在线观看老狼 | 一级a性色生活片久久毛片 一级特黄a大片 | 在线观看亚洲欧美 | 男女羞羞视频在线 | 亚洲另类春色偷拍在线观看 | 中文精品久久 | 中文字幕91av | 精品无码久久久久久国产 | 日皮视频免费 | 奇米久久 | 91精品国产欧美一区二区 | 精品成人69xx.xyz | 亚洲人成人一区二区在线观看 | 亚洲高清在线观看 | 国偷自产av一区二区三区 | 日日摸夜夜添夜夜添特色大片 | 91免费在线播放 | 国产精品久久久久久一级毛片 | 中文字幕视频在线免费 | 伊人免费在线观看 | 亚洲精品乱码久久久久久9色 |