技术干货Java 杂谈饥人谷技术博客

异步处理举例

2016-11-03  本文已影响0人  _挑灯看剑_

类比Java Web中的Servlet异步处理
类比JavaScript中的Ajax异步处理
类比WebSocket中的服务器端异步处理

servlet_async.png
处理过程:

AsyncServlet异步调用业务组件处理业务逻辑,则其通知AsyncTask异步线程调用业务组件,然后立即返回。与此同时,Web容器线程将AsyncContext对象传递给AsyncTask异步线程。
AsyncServlet调用业务组件之后,立即返回,并不知道异步线程中的业务处理何时完毕?有两种方法可以让容器线程知道异步线程处理业务完毕。

ajax_async.png
处理过程:

Ajax异步调用,通过XmlHttpRequest对象进行调用。在客户端js编写时,首先要在该对象上注册onReadyStateChange函数。这个函数监听服务器响应的状态变化,一旦状态有变化,则调用该函数。
浏览器端请求接口之后,立即返回,响应用户的其他操作(点击,加载等),浏览器并无法之后服务器端业务何时可以处理完毕?因此带着XmlHttpRequest对象开启异步线程,请求服务器端组件。服务器端组件完成与否都会有状态的变化,这个状态的变化的就会出发XmlHttpRequest对象上注册的监听器ReadyStateChange,从而调用相应的onReadyStateChange函数。

websocket_async.png
处理过程:

WebSocket的java服务器端要向客户端发送消息,可能发送这个消息非常耗时,那么此时会造成服务器端程序阻塞,使得服务器端的处理性能急剧下降。因此,可以对消息的发送进行异步处理。即WebSocket对应的Java API中的Async对象向服务器端发送消息时,调用send方法,其只是通知send方法,立即返回。异步线程(使用Future接口)来负责向客户端发送消息,此时容器主线程并不知道什么时候异步线程可以发送消息完毕。因此,在使用异步线程调用send方法的同时,将SendHandler接口传递给异步线程。当异步线程发送消息完毕时,则调用SendHandler接口的onResult方法,表明异步线程已经发送消息完毕,从而让容器主线程感知到。

上一篇下一篇

猜你喜欢

热点阅读