Java 回调机制

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的方法——调用回调接口。

参考文章:Java并发编程网

参考博客:https://blog.csdn.net/qq_31749835/article/details/90073185

posted @ 2021-03-30 17:57  MyDistance  阅读(556)  评论(0编辑  收藏  举报