博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出: Java回调机制(异步)
阅读量:6813 次
发布时间:2019-06-26

本文共 2663 字,大约阅读时间需要 8 分钟。

什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃

哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。

一、什么是回调

回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百度百科中是这样的:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用

回调是一种特殊的调用,至于三种方式也有点不同。

1、同步回调,即阻塞,单向

2、回调,即双向(类似自行车的两个齿轮)。

3、异步调用,即通过异步消息进行通知。

 

二、CS中的异步回调(java案例)

比如这里模拟个场景:客户端发送msg给服务端,服务端处理后(5秒),回调给客户端,告知处理成功。代码如下:

回调接口类:

1
2
3
4
5
6
7
8
/**
 
* @author Jeff Lee
 
* @since 2015-10-21 21:34:21
 
* 回调模式-回调接口类
 
*/
public
interface
CSCallBack {
    
public
void
process(String status);
}

模拟客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 
* @author Jeff Lee
 
* @since 2015-10-21 21:25:14
 
* 回调模式-模拟客户端类
 
*/
public
class
Client
implements
CSCallBack {
 
    
private
Server server;
 
    
public
Client(Server server) {
        
this
.server = server;
    
}
 
    
public
void
sendMsg(
final
String msg){
        
System.out.println(
"客户端:发送的消息为:"
+ msg);
        
new
Thread(
new
Runnable() {
            
@Override
            
public
void
run() {
                
server.getClientMsg(Client.
this
,msg);
            
}
        
}).start();
        
System.out.println(
"客户端:异步发送成功"
);
    
}
 
    
@Override
    
public
void
process(String status) {
        
System.out.println(
"客户端:服务端回调状态为:"
+ status);
    
}
}

模拟服务端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 
* @author Jeff Lee
 
* @since 2015-10-21 21:24:15
 
* 回调模式-模拟服务端类
 
*/
public
class
Server {
 
    
public
void
getClientMsg(CSCallBack csCallBack , String msg) {
        
System.out.println(
"服务端:服务端接收到客户端发送的消息为:"
+ msg);
 
        
// 模拟服务端需要对数据处理
        
try
{
            
Thread.sleep(
5
*
1000
);
        
}
catch
(InterruptedException e) {
            
e.printStackTrace();
        
}
        
System.out.println(
"服务端:数据处理成功,返回成功状态 200"
);
        
String status =
"200"
;
        
csCallBack.process(status);
    
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 
* @author Jeff Lee
 
* @since 2015-10-21 21:24:15
 
* 回调模式-测试类
 
*/
public
class
CallBackTest {
    
public
static
void
main(String[] args) {
        
Server server =
new
Server();
        
Client client =
new
Client(server);
 
        
client.sendMsg(
"Server,Hello~"
);
    
}
}

 

运行下测试类 — 打印结果如下:

客户端:发送的消息为:Server,Hello~

客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~

(这里模拟服务端对数据处理时间,等待5秒)

服务端:数据处理成功,返回成功状态 200
客户端:服务端回调状态为:200

一步一步分析下代码,核心总结如下

1、接口作为方法参数,其实际传入引用指向的是实现类

2、Client的sendMsg方法中,参数final,因为要被内部类一个新的线程可以使用。这里就体现了异步

3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。

 

还有值得一提的是(逃

— 开源代码都在我的哦~

 

三、回调的应用场景

回调目前运用在什么场景比较多呢?从操作系统开发者调用

1、Windows平台的消息机制

2、异步调用微信接口,根据微信返回状态对出业务逻辑响应。

3、Servlet中的Filter(过滤器)是基于回调函数,需容器支持。

补充:其中 Filter(过滤器)和Interceptor(拦截器)的区别,拦截器基于是Java的反射机制,和容器无关。但与回调机制有异曲同工之妙。

总之,这设计让底层代码调用高层定义(实现层)的子程序,增强了程序的灵活性。

 

四、模式对比

上面讲了Filter和Intercepter有着异曲同工之妙。其实接口回调机制和一种设计模式—观察者模式也有相似之处:

观察者模式

GOF说道 — “定义对象的一种一对多的依赖关系,当一个对象的状态发送改变的时候,所有对他依赖的对象都被通知到并更新。”它是一种模式,是通过接口回调的方法实现的,即它是一种回调的体现。

接口回调

与观察者模式的区别是,它是种原理,而非具体实现。

五、心得

总结四步走:

机制,即是原理。

模式,即是体现。

记住具体场景,常见模式。

然后深入理解原理。

转载地址:http://jxkzl.baihongyu.com/

你可能感兴趣的文章
Redis Lua脚本原理
查看>>
有时间测试dism
查看>>
/Users/alamps/AndroidStudioProjects/Demo10ScrollView
查看>>
【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
查看>>
为什么我刚发表的文章变成了“待审核”,csdn有没有官方解释啊
查看>>
Android多线程源码详解一:handler、looper、message、messageQueue
查看>>
SaaS加速器II 能力中心:互利互补 共享商业红利
查看>>
病毒木马防御与分析实战
查看>>
分布式工作流任务调度系统Easy Scheduler正式开源
查看>>
Flutter实战(一)写一个天气查询的APP
查看>>
Python零基础学习笔记(十二)—— 字符串及其常用方法
查看>>
Webpack 和 Gulp 构建伪命令行项目
查看>>
在线面试, 前端, 提纲, 草稿
查看>>
hive_异常_01_ Terminal initialization failed; falling back to unsupported
查看>>
分布式事务键值数据库 TiKV 加入 CNCF 沙箱孵化器
查看>>
Vue - day1
查看>>
kvm.virsh常用命令篇
查看>>
[Hive]Hive使用指南四 客户端导入数据
查看>>
10.JUC线程高级-线程八锁
查看>>
Apache Flink轻量级异步快照机制源码分析
查看>>