博客
关于我
Java 回调机制
阅读量:571 次
发布时间:2019-03-11

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

Java 回调机制

在Java核心技术I中接触到了回调这个名词,在这里整理下思路。

1、方法调用的三种方式

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

  • 同步调用:即阻塞调用,单向,是最基本并且最简单的一种调用方式,方法 a() 调用方法 b() ,等到 方法 b() 执行完后才继续执行方法 a().
  • 异步调用:即通过异步消息进行通知,通过方法 a() new 一个线程调用方法 b() , 例如微信消息推送的情景。
  • 回调:即双向,调用 + 反调。类A的a()方法调用类B的b()方法, 类B的b()方法执行完毕主动调用类A的callback()方法。

2、例子演示

一个员工做完了手头的工作,发送消息通知,得到回复才可以走人(笑了)。

2.1、回调接口类

/** * 回调模式-回调接口类 */public interface Work {    void goHome(String content);}

2.2、员工工作类,实现回调接口

/** * 回调模式-员工工作类,实现回调接口类 */public class EmployeeWork implements Work{    /**     * 异步调用,发送完成工作的消息     *     * @param content  消息     * @param message  消息处理类     */    public void complete(final String content, final Message message){        //创建线程        new Thread(() -> {            //将员工工作的引用传入消息处理的方法            message.ask(content, EmployeeWork.this);        }).start();        waiting();    }    /**     * 准备回家     */    public void waiting() {        System.out.println("准备回家");    }    /**     * 被回调方法,得到消息可以回家了     * @param content     */    @Override    public void goHome(String content) {        System.out.println("得到通知," + content + "工作,可以下班了");    }}

2.3、消息处理类,这里回调方法。

/** * 回调模式-消息处理类,回调方法 */public class Message {    /**     * 处理消息并回调     *     * @param content 消息     * @param work     回调接口,为了安全向上转型     */    public void ask(String content, Work work) {        if (content.contains("完成")) {            System.out.println("收到" + content + "的通知");            //回调方法            work.goHome(content);        }    }}

2.4、测试类

public class CallBackTest {    public static void main(String[] args) {        EmployeeWork employeeWork = new EmployeeWork();        String content = "完成微信推送";        employeeWork.complete(content, new Message());    }}

输出结果如下:

准备回家收到完成微信推送的通知得到通知,完成微信推送工作,可以下班了

2.5、小结

以上是异步回调的简单示例,回调方法最大的优势在于就在于异步回调,这是其最被广为使用的原因

3、应用场景

  1. Windows平台的消息机制。
  2. 异步调用微信接口,根据微信返回状态对出业务逻辑响应。
  3. Servlet中的Filter(过滤器)是基于回调函数,需容器支持。

4、回调的步骤

  1. A类实现接口CallBack callback。
  2. A类中包含了一个B的引用。
  3. B中有一个参数为CallBack的方法f(CallBack callback)。
  4. 在A类中调用B的方法f(CallBack callback)——注册回调接口。
  5. B就可以在f(CallBack callback)方法中调用A的方法——调用回调接口。

参考文章:

参考博客:

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

你可能感兴趣的文章
无法打开文件“opencv_world330d.lib”的解决办法
查看>>
maven项目出现 Missing artifact jdk.tools:jdk.tools:jar:1.7
查看>>
maven项目通过Eclipse上传到svn上面,再导入到本地出现指定的类找不到的问题
查看>>
maven 项目部署到tomcat下 没有class文件
查看>>
算法训练 未名湖边的烦恼(递归,递推)
查看>>
算法训练 完数(循环,数学知识)
查看>>
什么是接口
查看>>
2020版nodejs12.18.3安装配置教程
查看>>
iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
查看>>
记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
查看>>
JavaScript高级程序设计第四版学习记录-第九章代理与反射
查看>>
怎么解决Windows 10文件/文件夹正在使用无法删除
查看>>
F28335第九篇——通用IO
查看>>
STM32F429第十一篇之数据类型
查看>>
web项目开发记录
查看>>
matlab函数:sprintf详解
查看>>
matlab函数:fix 向0取整
查看>>
ORCAD创建元件库时,格点对不起怎么办
查看>>
Allegro中如何消除器件本身Pin间距报错
查看>>
AD中拖动器件,无法移动在一起如何解决
查看>>