異步處理舉例

類比Java Web中的Servlet異步處理
類比JavaScript中的Ajax異步處理
類比WebSocket中的服務器端異步處理

  • 類比Java Web中的Servlet異步處理

servlet_async.png
處理過程:

AsyncServlet異步調(diào)用業(yè)務組件處理業(yè)務邏輯,則其通知AsyncTask異步線程調(diào)用業(yè)務組件,然后立即返回。與此同時,Web容器線程將AsyncContext對象傳遞給AsyncTask異步線程。
AsyncServlet調(diào)用業(yè)務組件之后,立即返回,并不知道異步線程中的業(yè)務處理何時完畢?有兩種方法可以讓容器線程知道異步線程處理業(yè)務完畢。

  • 容器主線程將AsyncContext對象傳遞給異步線程,當異步線程處理業(yè)務完畢之后,將調(diào)用AsyncContext對象的complete方法或者dispach方法,表明業(yè)務處理完畢。

  • 容器線程為AsyncContext對象添加監(jiān)聽器,這個監(jiān)聽器監(jiān)聽異步線程是否完成業(yè)務處理。當異步線程完成處理之后,則調(diào)用Complete方法或者dispatch方法,這將觸發(fā)AsyncListener監(jiān)聽器的onComplete方法。這個方法,由程序自定義,通過調(diào)用這個方法,可以使得容器主線程感知到異步線程處理業(yè)務完畢。

  • 類比JavaScript中的Ajax異步處理

ajax_async.png
處理過程:

Ajax異步調(diào)用,通過XmlHttpRequest對象進行調(diào)用。在客戶端js編寫時,首先要在該對象上注冊onReadyStateChange函數(shù)。這個函數(shù)監(jiān)聽服務器響應的狀態(tài)變化,一旦狀態(tài)有變化,則調(diào)用該函數(shù)。
瀏覽器端請求接口之后,立即返回,響應用戶的其他操作(點擊,加載等),瀏覽器并無法之后服務器端業(yè)務何時可以處理完畢?因此帶著XmlHttpRequest對象開啟異步線程,請求服務器端組件。服務器端組件完成與否都會有狀態(tài)的變化,這個狀態(tài)的變化的就會出發(fā)XmlHttpRequest對象上注冊的監(jiān)聽器ReadyStateChange,從而調(diào)用相應的onReadyStateChange函數(shù)。

  • 類比WebSocket中的服務器端異步處理

websocket_async.png
處理過程:

WebSocket的java服務器端要向客戶端發(fā)送消息,可能發(fā)送這個消息非常耗時,那么此時會造成服務器端程序阻塞,使得服務器端的處理性能急劇下降。因此,可以對消息的發(fā)送進行異步處理。即WebSocket對應的Java API中的Async對象向服務器端發(fā)送消息時,調(diào)用send方法,其只是通知send方法,立即返回。異步線程(使用Future接口)來負責向客戶端發(fā)送消息,此時容器主線程并不知道什么時候異步線程可以發(fā)送消息完畢。因此,在使用異步線程調(diào)用send方法的同時,將SendHandler接口傳遞給異步線程。當異步線程發(fā)送消息完畢時,則調(diào)用SendHandler接口的onResult方法,表明異步線程已經(jīng)發(fā)送消息完畢,從而讓容器主線程感知到。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,789評論 11 349
  • 一、多線程 說明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過 New 關鍵字創(chuàng)...
    Java旅行者閱讀 4,858評論 0 44
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評論 19 139
  • 10月3日上午,山東萊鋼醫(yī)院發(fā)生一起惡性傷醫(yī)事件,兒科醫(yī)生李寶華被患者家屬用砍刀砍成重傷,身中27刀,其中頭部12...
    語不惜閱讀 891評論 10 14
  • iOS中,有時候我們判斷某個字符串是否為空,卻發(fā)現(xiàn)判斷不對,常見的是isEqualToString,但這有時候卻發(fā)...
    哈哈大p孩閱讀 5,607評論 1 5

友情鏈接更多精彩內(nèi)容