偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring Boot使用@Async實(shí)現(xiàn)異步調(diào)用:自定義線程池

企業(yè)動態(tài)
本文中的例子我們可以在之前的例子基礎(chǔ)上修改,也可以創(chuàng)建一個全新的Spring Boot項(xiàng)目來嘗試。

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

[[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創(chuàng)建了一個線程池,同時(shí)設(shè)置了以下這些參數(shù):

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

使用線程池

在定義了線程池之后,我們?nèi)绾巫尞惒秸{(diào)用的執(zhí)行任務(wù)使用這個線程池中的資源來運(yùn)行呢?方法非常簡單,我們只需要在@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("開始做任務(wù)一"); 
  10.         long start = System.currentTimeMillis(); 
  11.         Thread.sleep(random.nextInt(10000)); 
  12.         long end = System.currentTimeMillis(); 
  13.         log.info("完成任務(wù)一,耗時(shí):" + (end - start) + "毫秒"); 
  14.     } 
  15.  
  16.     @Async("taskExecutor"
  17.     public void doTaskTwo() throws Exception { 
  18.         log.info("開始做任務(wù)二"); 
  19.         long start = System.currentTimeMillis(); 
  20.         Thread.sleep(random.nextInt(10000)); 
  21.         long end = System.currentTimeMillis(); 
  22.         log.info("完成任務(wù)二,耗時(shí):" + (end - start) + "毫秒"); 
  23.     } 
  24.  
  25.     @Async("taskExecutor"
  26.     public void doTaskThree() throws Exception { 
  27.         log.info("開始做任務(wù)三"); 
  28.         long start = System.currentTimeMillis(); 
  29.         Thread.sleep(random.nextInt(10000)); 
  30.         long end = System.currentTimeMillis(); 
  31.         log.info("完成任務(wù)三,耗時(shí):" + (end - start) + "毫秒"); 
  32.     } 
  33.  

單元測試

***,我們來寫個單元測試來驗(yàn)證一下

  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.  

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

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

完整示例:

讀者可以根據(jù)喜好選擇下面的兩個倉庫中查看Chapter4-1-3項(xiàng)目:

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

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

【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系作者獲取授權(quán)】

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

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

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異步調(diào)用@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異步調(diào)用

2022-09-27 12:01:56

Spring異步調(diào)用方式

2016-08-18 13:56:33

AndroidExecutorsubmit

2017-08-03 17:00:54

Springmvc任務(wù)執(zhí)行器

2010-03-18 16:19:02

Java自定義線程池

2013-01-09 17:22:38

Android開發(fā)Camera

2009-08-21 11:24:16

C#異步調(diào)用

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異步調(diào)用

2009-10-20 16:48:30

C#委托
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號