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

項(xiàng)目中發(fā)現(xiàn)了一個(gè)新的玩意WebAsyncTask

開(kāi)發(fā) 項(xiàng)目管理
異步請(qǐng)求的處理。除了異步請(qǐng)求,一般上我們用的比較多的應(yīng)該是異步調(diào)用。通常在開(kāi)發(fā)過(guò)程中,會(huì)遇到一個(gè)方法是和實(shí)際業(yè)務(wù)無(wú)關(guān)的,沒(méi)有緊密性的。比如記錄日志信息等業(yè)務(wù)。

[[403136]]

本文轉(zhuǎn)載自微信公眾號(hào)「六脈神劍的程序人生」,作者六脈神劍小六六。轉(zhuǎn)載本文請(qǐng)聯(lián)系六脈神劍的程序人生公眾號(hào)。

絮叨

剛好在讀項(xiàng)目代碼的時(shí)候,發(fā)現(xiàn)了WebAsyncTask這個(gè)新玩意,給大家來(lái)科普科普,不是那么的深入,不喜勿噴!

 

SpringBoot中同異步調(diào)用的使用

異步請(qǐng)求的處理。除了異步請(qǐng)求,一般上我們用的比較多的應(yīng)該是異步調(diào)用。通常在開(kāi)發(fā)過(guò)程中,會(huì)遇到一個(gè)方法是和實(shí)際業(yè)務(wù)無(wú)關(guān)的,沒(méi)有緊密性的。比如記錄日志信息等業(yè)務(wù)。這個(gè)時(shí)候正常就是啟一個(gè)新線程去做一些業(yè)務(wù)處理,讓主線程異步的執(zhí)行其他業(yè)務(wù)。

  • 同步請(qǐng)求

  • 異步請(qǐng)求

SprinBoot中@Async異步方法

異步的好處是,可以提高程序吞吐量,一個(gè)任務(wù),讓耗時(shí)的異步處理,并繼續(xù)同步處理后面的任務(wù),異步任務(wù)可以返回結(jié)果,拿到結(jié)果后可結(jié)合同步處理過(guò)程中的變量一起處理計(jì)算

具體的使用

在Spring中,基于@Async標(biāo)注的方法,稱之為異步方法;這些方法將在執(zhí)行的時(shí)候,將會(huì)在獨(dú)立的線程中被執(zhí)行,調(diào)用者無(wú)需等待它的完成,即可繼續(xù)其他的操作。

自定義線程池異步調(diào)用

配置@EnableAsync使@Async生效

  1. @SpringBootApplication 
  2. @EnableAsync 
  3. public class Application { 
  4.   
  5.  public static void main(String[] args) { 
  6.   SpringApplication.run(Application.class, args); 
  7.  } 
  8.   

自定義線程池

  1. @Component 
  2. @Scope  //單例 
  3. public class MyExecutePoll { 
  4.   
  5.     @Bean 
  6.     public Executor myAsyncPool() { 
  7.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  8.         //核心線程池大小 
  9.         executor.setCorePoolSize(20); 
  10.         //最大線程數(shù) 
  11.         executor.setMaxPoolSize(40); 
  12.         //隊(duì)列容量 
  13.         executor.setQueueCapacity(50); 
  14.         // 活躍時(shí)間 
  15.         executor.setKeepAliveSeconds(300); 
  16.         // 線程名字前綴 
  17.         executor.setThreadNamePrefix("MyExecutor-"); 
  18.         //設(shè)置線程池關(guān)閉的時(shí)候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean,使異步線程的銷毀優(yōu)先于Redis等其他處理報(bào)錯(cuò) 
  19.         executor.setWaitForTasksToCompleteOnShutdown(true); 
  20.         //設(shè)置線程池中任務(wù)的等待時(shí)間,如果超過(guò)這個(gè)時(shí)候還沒(méi)有銷毀就強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住 
  21.         executor.setAwaitTerminationSeconds(60); 
  22.         // setRejectedExecutionHandler:當(dāng)pool已經(jīng)達(dá)到max size的時(shí)候,如何處理新任務(wù) 
  23.         // CallerRunsPolicy:不在新線程中執(zhí)行任務(wù),而是由調(diào)用者所在的線程來(lái)執(zhí)行 
  24.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
  25.         executor.initialize(); 
  26.         return executor; 
  27.     } 
  28.   

使用@Async

  1. @Async("myAsyncPool")   //@Async使用默認(rèn)的線程 
  2. public Future<String> doTask() throws Exception { 
  3.     //業(yè)務(wù)處理   使用Future返回異步調(diào)用結(jié)果 
  4.     return new AsyncResult<>("任務(wù)一完成"); 

在Spring中運(yùn)用 Async注解 需要注意幾點(diǎn):

  • AsyncTest.java,測(cè)試類,調(diào)用異步任務(wù),同時(shí)執(zhí)行同步方法
  • OrderService.java,異步任務(wù)類,提供異步方法
  • AsyncThreadPoolConfig.java,異步任務(wù)線程池配置類,配置異步任務(wù)運(yùn)行的線程池大小等

基于Spring實(shí)現(xiàn)異步請(qǐng)求

Spring可以通過(guò)Callable或者WebAsyncTask等方式實(shí)現(xiàn)異步請(qǐng)求, 我們來(lái)看看,這2種實(shí)現(xiàn)方式!

Callable

Callable是為了異步生成返回值提供基本的支持。簡(jiǎn)單來(lái)說(shuō)就是一個(gè)請(qǐng)求進(jìn)來(lái),如果你使用了Callable,在沒(méi)有得到返回?cái)?shù)據(jù)之前,DispatcherServlet和所有Filter就會(huì)退出Servlet容器線程,但響應(yīng)保持打開(kāi)狀態(tài),一旦返回?cái)?shù)據(jù)有了,這個(gè)DispatcherServlet就會(huì)被再次調(diào)用并且處理,以異步產(chǎn)生的方式,向請(qǐng)求端返回值。這么做的好處就是請(qǐng)求不會(huì)長(zhǎng)時(shí)間占用服務(wù)連接池,提高服務(wù)器的吞吐量。

  1. @GetMapping("/callable"
  2.     public Callable<String> testCallable() throws InterruptedException { 
  3.         log.info("主線程開(kāi)始!"); 
  4.         Callable<String> result = new Callable<String>() { 
  5.  
  6.             @Override 
  7.             public String call() throws Exception { 
  8.                 log.info("副線程開(kāi)始!"); 
  9.                 Thread.sleep(1000); 
  10.                 log.info("副線程結(jié)束!"); 
  11.                 return "SUCCESS"
  12.             } 
  13.  
  14.         }; 
  15.         log.info("主線程結(jié)束!"); 
  16.         return result; 
  17.     } 

輸出結(jié)果

  1. 主線程開(kāi)始! 
  2.  
  3. 主線程結(jié)束! 
  4.  
  5. 副線程開(kāi)始! 
  6.  
  7. 副線程結(jié)束! 

WebAsyncTask

一個(gè)請(qǐng)求到服務(wù)上,是用的web容器的線程接收的

我們可以使用WebAsyncTask將這個(gè)請(qǐng)求分發(fā)給一個(gè)新的線程去執(zhí)行,容器的線程可以去接收其他請(qǐng)求的處理。一旦WebAsyncTask返回?cái)?shù)據(jù)有了,就會(huì)被再次調(diào)用并且處理,以異步產(chǎn)生的方式,向請(qǐng)求端返回值,但是其實(shí)我覺(jué)得前端的請(qǐng)求rt并不會(huì)說(shuō)變短。

  1. /** 
  2.     * 查詢 
  3.     */ 
  4.    @RequestMapping(method = RequestMethod.GET, value = "/aysncTask/{testId}"
  5.    @ResponseStatus(HttpStatus.OK) 
  6.    public WebAsyncTask<Response> aysncTask(@PathVariable("testId") String testId) { 
  7.        System.out.println(String.format("/aysncTask/%s 被調(diào)用 thread id is: %s", testId,Thread.currentThread().getName())); 
  8.        Callable<Response> callable = () -> { 
  9.            Thread.sleep(1000L); 
  10.            Response response = new Response(true,"異步執(zhí)行成功"); 
  11.            System.out.println(String.format("/aysncTask/%s 被調(diào)用 thread id is: %s", testId,Thread.currentThread().getName())); 
  12.            return response; 
  13.        }; 
  14.        return new WebAsyncTask<Response>(callable); 
  15.    } 

控制臺(tái)打印如下:在執(zhí)行業(yè)務(wù)邏輯之前的線程和具體處理業(yè)務(wù)邏輯的線程不是同一個(gè),達(dá)到了我們的目的。async-customize-1這個(gè)前綴是我們自定義的下邊會(huì)說(shuō)

  1. /aysncTask/12348567676 被調(diào)用 thread id is: http-nio-8084-exec-1 
  2. /aysncTask/12348567676 被調(diào)用 thread id is: async-customize-1 

其實(shí)WebAsyncTask比起Callable是有以下幾個(gè)優(yōu)點(diǎn)的

官方有這么一句話,截圖給你:

如果我們需要超時(shí)處理的回調(diào)或者錯(cuò)誤處理的回調(diào),我們可以使用WebAsyncTask代替Callable

實(shí)際使用中,我并不建議直接使用Callable ,而是使用Spring提供的WebAsyncTask 代替,它包裝了Callable,功能更強(qiáng)大些

總結(jié)

 

其實(shí)本文就是給大家科普下,一些異步的用法,不至于說(shuō)看到人家這么用很蒙b,多線程的東西還是優(yōu)點(diǎn)東西的,大家一起學(xué)習(xí)。

 

責(zé)任編輯:武曉燕 來(lái)源: 六脈神劍的程序人生
相關(guān)推薦

2021-06-17 10:01:54

APT活動(dòng)Victory 后門(mén)惡意軟件

2021-01-26 11:16:12

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-04-28 09:41:29

Linux 操作系統(tǒng)漏洞Microsoft

2021-10-29 11:45:26

Python代碼Python 3.

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2023-02-26 01:02:22

2021-12-29 19:20:41

數(shù)據(jù)GitHub服務(wù)器

2021-06-09 14:45:50

安全漏洞攻擊漏洞

2021-06-09 18:59:48

AI

2021-03-06 13:31:52

網(wǎng)絡(luò)釣魚(yú)惡意郵件攻擊

2024-05-20 08:25:55

2019-01-14 11:10:43

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2020-06-09 08:05:11

Android 代碼操作系統(tǒng)

2023-05-17 00:22:15

2021-03-08 10:58:03

漏洞Microsoft E微軟

2021-04-28 14:31:35

Dubbo接口日志

2021-04-08 15:30:14

谷歌Android開(kāi)發(fā)者

2020-06-16 08:39:35

JavaScript圖像處理庫(kù)

2020-05-18 08:42:23

CSS背景圖像前端開(kāi)發(fā)
點(diǎn)贊
收藏

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