这篇文章将为大家详细讲解有关Java项目中如何实现异步回调,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> Java异步回调机制强>
<强>一、什么是回调强>
回调,回调。要先有调用,才有调用者和被调用者之间的回调,所以在百度百科中是这样的:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用,回调和异步调用。
回调是一种特殊的调用,至于三种方式也有点不同。
1,同步回调,即阻塞,单向。
2,回调,即双向(类似自行车的两个齿轮)。
3,异步调用,即通过异步消息进行通知。
<强>二、CS中的异步回调(Java案例)强>
比如这里模拟个场景:客户端发送味精给服务端,服务端处理后(5秒),回调给客户端,告知处理成功。代码如下:
回调接口类:
/* * * @author杰夫?李 * @since 2015-10-21 21:34:21 *回调模式,回调接口类 */公共接口CSCallBack { 公共空间过程(字符串状态); }
模拟客户端:
/* * * @author杰夫?李 * @since 2015-10-21 21:25:14 *回调模式,模拟客户端类 */公共类客户端实现CSCallBack { 私人服务器服务器; 公共客户端(服务器服务器){ 这一点。服务器=服务器; } 公共空间sendMsg(最终字符串味精){ System.out.println(“客户端:发送的消息为:“+味精); 新线程(新Runnable () { @Override 公共空间run () { server.getClientMsg (Client.this、味精); } }) .start (); System.out.println(“客户端:异步发送成功“); } @Override 公共空间过程(字符串状态){ System.out.println(“客户端:服务端回调状态为:“+状态); } }
模拟服务端:
/* * * @author杰夫?李 * @since 2015-10-21 21:24:15 *回调模式,模拟服务端类 */公共类服务器{ 公共空间getClientMsg (CSCallBack CSCallBack,字符串味精){ System.out.println(“服务端:服务端接收到客户端发送的消息为:“+味精);//模拟服务端需要对数据处理 尝试{ 线程。睡眠(5 * 1000); }捕捉(InterruptedException e) { e.printStackTrace (); } System.out.println(“服务端:数据处理成功,返回成功状态200“); 字符串状态=?00“; csCallBack.process(状态); } }
测试类:
/* * * @author杰夫?李 * @since 2015-10-21 21:24:15 *回调模式——测试类 */公开课CallBackTest { 公共静态void main (String [] args) { 服务器服务器=新的服务器(); 客户端=新的客户端(服务器); client.sendMsg(“服务器,你好~“); } }
运行下测试类——打印结果如下:
客户端:发送的消息为:服务器,你好~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:服务器,你好~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态200
客户端:服务端回调状态为:200
一步一步分析下代码,核心总结如下
1,接口作为方法参数,其实际传入引用指向的是实现类
2,客户的sendMsg方法中,参数为决赛,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3,调用服务器的getClientMsg(),参数传入了客户本身(对应第一点)。
<强>三,回调的应用场景强>
回调目前运用在什么场景比较多呢?从操作系统到开发者调用:
1, Windows平台的消息机制
2,异步调用微信接口,根据微信返回状态对出业务逻辑响应。
3, Servlet中的过滤器(过滤器)是基于回调函数,需容器支持。
补充:其中过滤器(过滤器)和拦截器(拦截器)的区别,拦截器基于是Java的反射机制,和容器无关。但与回调机制有异曲同工之妙。
总之,这设计让底层代码调用高层定义(实现层)的子程序,增强了程序的灵活性。
<强>四、模式对比强>
上面讲了过滤器和拦截器有着异曲同工之妙,其实接口回调机制和一种设计模式,观察者模式也有相似之处:
观察者模式:
GOF说道——“定义对象的一种一对多的依赖关系,当一个对象的状态发送改变的时候,所有对他依赖的对象都被通知到并更新。”它是一种模式,是通过接口回调的方法实现的,即它是一种回调的体现。