在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java回调机制(异步)

2017-2-7 13:43| 发布者: zhangjf| 查看: 619| 评论: 0

摘要: Writer :BYSocket(泥沙砖瓦浆木匠) 什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃 哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不 ...

Writer :BYSocket(泥沙砖瓦浆木匠)

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

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

一、什么是回调

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

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

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

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

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

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

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

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

回调接口类:

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

模拟客户端:

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

模拟服务端:

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

测试类:

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

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

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

还有值得一提的是(逃

— 开源代码都在我的gitHub上哦~

三、回调的应用场景

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

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

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

四、模式对比

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

观察者模式

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

接口回调

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


五、心得

总结四步走:

微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket


最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 19:52

Copyright 2015-2025 djqfx

返回顶部