zoukankan      html  css  js  c++  java
  • 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

    自我控制是最强者的本能-萧伯纳
  • 相关阅读:
    写代码随想
    学生管理系统
    自定义栈
    位运算符加密
    自定义Vector
    二叉树排序
    双向循环链表
    双向链表
    加载properties文件
    通讯录
  • 原文地址:https://www.cnblogs.com/CF1314/p/14598031.html
Copyright © 2011-2022 走看看