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

處理過程:
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異步調(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的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ā)送消息完畢,從而讓容器主線程感知到。