自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

[[233638]]

定義線程池

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

  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.  

上面我們通過(guò)使用ThreadPoolTaskExecutor創(chuàng)建了一個(gè)線程池,同時(shí)設(shè)置了以下這些參數(shù):

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

使用線程池

在定義了線程池之后,我們?nèi)绾巫尞惒秸{(diào)用的執(zhí)行任務(wù)使用這個(gè)線程池中的資源來(lái)運(yùn)行呢?方法非常簡(jiǎ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.  

單元測(cè)試

***,我們來(lái)寫個(gè)單元測(cè)試來(lái)驗(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í)行上面的單元測(cè)試,我們可以在控制臺(tái)中看到所有輸出的線程名前都是之前我們定義的線程池前綴名開始的,說(shuō)明我們使用線程池來(lái)執(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ù)喜好選擇下面的兩個(gè)倉(cāng)庫(kù)中查看Chapter4-1-3項(xiàng)目:

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

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

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

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

 

責(zé)任編輯:武曉燕 來(lái)源: 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異步請(qǐng)求

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:23:46

JavaScript異

2009-07-01 14:37:14

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ù)棧公眾號(hào)