类比Java Web中的Servlet异步处理
类比JavaScript中的Ajax异步处理
类比WebSocket中的服务器端异步处理
-
类比Java Web中的Servlet异步处理
处理过程:
AsyncServlet异步调用业务组件处理业务逻辑,则其通知AsyncTask异步线程调用业务组件,然后立即返回。与此同时,Web容器线程将AsyncContext对象传递给AsyncTask异步线程。
AsyncServlet调用业务组件之后,立即返回,并不知道异步线程中的业务处理何时完毕?有两种方法可以让容器线程知道异步线程处理业务完毕。
容器主线程将AsyncContext对象传递给异步线程,当异步线程处理业务完毕之后,将调用AsyncContext对象的complete方法或者dispach方法,表明业务处理完毕。
容器线程为AsyncContext对象添加监听器,这个监听器监听异步线程是否完成业务处理。当异步线程完成处理之后,则调用Complete方法或者dispatch方法,这将触发AsyncListener监听器的onComplete方法。这个方法,由程序自定义,通过调用这个方法,可以使得容器主线程感知到异步线程处理业务完毕。
-
类比JavaScript中的Ajax异步处理
处理过程:
Ajax异步调用,通过XmlHttpRequest对象进行调用。在客户端js编写时,首先要在该对象上注册onReadyStateChange函数。这个函数监听服务器响应的状态变化,一旦状态有变化,则调用该函数。
浏览器端请求接口之后,立即返回,响应用户的其他操作(点击,加载等),浏览器并无法之后服务器端业务何时可以处理完毕?因此带着XmlHttpRequest对象开启异步线程,请求服务器端组件。服务器端组件完成与否都会有状态的变化,这个状态的变化的就会出发XmlHttpRequest对象上注册的监听器ReadyStateChange,从而调用相应的onReadyStateChange函数。
-
类比WebSocket中的服务器端异步处理
处理过程:
WebSocket的java服务器端要向客户端发送消息,可能发送这个消息非常耗时,那么此时会造成服务器端程序阻塞,使得服务器端的处理性能急剧下降。因此,可以对消息的发送进行异步处理。即WebSocket对应的Java API中的Async对象向服务器端发送消息时,调用send方法,其只是通知send方法,立即返回。异步线程(使用Future接口)来负责向客户端发送消息,此时容器主线程并不知道什么时候异步线程可以发送消息完毕。因此,在使用异步线程调用send方法的同时,将SendHandler接口传递给异步线程。当异步线程发送消息完毕时,则调用SendHandler接口的onResult方法,表明异步线程已经发送消息完毕,从而让容器主线程感知到。