成人免费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技術棧公眾號

主站蜘蛛池模板: 国产精品美女在线观看 | 日韩图区 | www.青青草| 日本精品一区二区 | 国产专区在线 | 懂色av一区二区三区在线播放 | 亚洲视频手机在线 | h在线播放 | 亚洲视频免费一区 | 国产精品永久免费视频 | 日本天堂一区 | 国产精品久久久爽爽爽麻豆色哟哟 | 在线视频一区二区三区 | 欧美日韩网站 | 亚洲精品欧美一区二区三区 | 欧美激情久久久久久 | 中文字幕免费视频 | 天天干天天操天天射 | 久久精品二区 | 日韩电影在线 | 色99视频| 亚洲人人 | 免费视频一区二区 | 亚洲在线免费 | 亚洲视频在线观看免费 | 国产一区二区三区在线免费 | 午夜精品久久久久久久久久久久 | 日韩欧美国产精品一区二区三区 | 日韩福利 | 亚洲精品久久久久久国产精华液 | 91在线精品视频 | 欧美理论片在线 | 国产成人精品a视频 | 亚洲国产精品一区二区久久 | 久久久视 | 蜜桃av鲁一鲁一鲁一鲁 | 韩国成人在线视频 | 丁香婷婷综合激情五月色 | 高清不卡毛片 | 精品久久久久久久久久久久久 | 成人免费淫片aa视频免费 |