异步处理举例

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

  • 类比Java Web中的Servlet异步处理

servlet_async.png
处理过程:

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

  • 容器主线程将AsyncContext对象传递给异步线程,当异步线程处理业务完毕之后,将调用AsyncContext对象的complete方法或者dispach方法,表明业务处理完毕。

  • 容器线程为AsyncContext对象添加监听器,这个监听器监听异步线程是否完成业务处理。当异步线程完成处理之后,则调用Complete方法或者dispatch方法,这将触发AsyncListener监听器的onComplete方法。这个方法,由程序自定义,通过调用这个方法,可以使得容器主线程感知到异步线程处理业务完毕。

  • 类比JavaScript中的Ajax异步处理

ajax_async.png
处理过程:

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

  • 类比WebSocket中的服务器端异步处理

websocket_async.png
处理过程:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,623评论 11 349
  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,829评论 0 44
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,314评论 19 139
  • 10月3日上午,山东莱钢医院发生一起恶性伤医事件,儿科医生李宝华被患者家属用砍刀砍成重伤,身中27刀,其中头部12...
    语不惜阅读 868评论 10 14
  • iOS中,有时候我们判断某个字符串是否为空,却发现判断不对,常见的是isEqualToString,但这有时候却发...
    哈哈大p孩阅读 5,606评论 1 5

友情链接更多精彩内容