通过简易例子讲解Java回调机制

 更新时间:2019年11月22日 11:12:32   作者:小北觅  
这篇文章主要介绍了通过简易例子讲解Java回调机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了通过简易例子讲解Java回调机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

首先说点题外话。为什么要写这篇文章,因为在看J.U.C包的FutureTask源码的时候,有一个done()方法,这是个抽象方法,用户实现它之后,FutureTask会在执行完后调用这个方法。这就是回调机制,回调的思想就是:

  • 类A调用类B的b方法
  • 类B的b方法执行完毕主动调用类A的callback()方法

给出思想过于抽象,所以我会举出一个简单的实例(虽然简单,但是能说明问题),并总结Java实现回调的步骤。

实例基于知乎上一个解释什么是回调机制的回答。

描述: 一个顾客入住了一个酒店,酒店提供叫醒服务,顾客由于第二天早晨有很重要的事情,所以使用了叫醒服务。让酒店工作人员在第二天早晨7:00叫醒顾客。

在这个例子中,顾客是A类,酒店是B类,顾客预订叫醒服务相当于A调用了B的b方法,酒店叫醒顾客相当于B调用了A的callback方法(被叫醒)。

下面给出代码:

1、首先是回调接口:

package callback;
//回调接口
public interface CallBack {
  public void beWakedUp();
}

2、接着是顾客类

顾客类实现回调接口

package callback;

public class Customer implements CallBack {
  //顾客同时持有酒店类的对象,后面定义
  private Hotel hotel;

  public Customer(Hotel hotel) {
    this.hotel = hotel;
  }

  @Override
  public void beWakedUp() {
    System.out.println("被叫醒了");
  }

  // 客户预约使用酒店的叫醒功能
  public void bookWakeService() {
    hotel.wakeService(this);
  }
  // 省略get set
}

3、酒店类

package callback;

public class Hotel {

  public void wakeService(CallBack callBack) {
    System.out.println("顾客预约了叫醒服务");
    try {
      // 模拟时间过了一晚上
      Thread.sleep(3000);
      System.out.println("时间过去了一夜");
      callBack.beWakedUp();
    } catch (InterruptedException e) {

      e.printStackTrace();
    }
  }
}

4、测试主类

package callback;

public class Main {
  
  public static void main(String[] args) {
    Hotel hotel = new Hotel();
    Customer customer = new Customer(hotel);
    customer.bookWakeService();
  }
}

输出结果为:

不知道你对回调机制有没有进一步理解呢?

最后总结一下Java中实现回调机制的大体步骤吧:

  • 定义回调接口CallBack
  • 类A实现回调接口CallBack,同时持有类B的对象b
  • 类B中有方法method(CallBack cb)
  • 由于A中持有B的对象,所以A可以调用B的method方法,并将自身作为参数传入method(因为A实现了CallBack接口,所以可以传入)。
  • method方法执行完毕后,调用回调方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于Struts文件上传(FormFile)详解

    基于Struts文件上传(FormFile)详解

    下面小编就为大家带来一篇基于Struts文件上传(FormFile)详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 基于Java的电梯系统实现过程

    基于Java的电梯系统实现过程

    这篇文章主要介绍了基于Java的电梯系统实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot实现加载yml文件中字典数据

    SpringBoot实现加载yml文件中字典数据

    这篇文章主要为大家详细介绍了SpringBoot如何实现加载yml文件中字典数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • SpringMVC和rabbitmq集成的使用案例

    SpringMVC和rabbitmq集成的使用案例

    这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • js-tab选项卡

    js-tab选项卡

    本文主要介绍了js-tab选项卡的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 简单聊聊Java程序中的换行符

    简单聊聊Java程序中的换行符

    Java程序中的换行符一般使用“\n”表示,它是一个转义字符,表示换行符。根据操作系统的不同,换行符的实际表示可能不同,本文就来简单聊聊他们的区别与使用吧
    2023-03-03
  • SpringBoot 自动装配的原理详解分析

    SpringBoot 自动装配的原理详解分析

    这篇文章主要介绍了SpringBoot 自动装配的原理详解分析,文章通过通过一个案例来看一下自动装配的效果展开详情,感兴趣的小伙伴可以参考一下
    2022-08-08
  • java栈实现二叉树的非递归遍历的示例代码

    java栈实现二叉树的非递归遍历的示例代码

    这篇文章主要介绍了java栈实现二叉树的非递归遍历,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 深入理解Java高级特性——注解

    深入理解Java高级特性——注解

    这篇文章主要介绍了Java高级特性——注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • java开发RocketMQ之NameServer路由管理源码分析

    java开发RocketMQ之NameServer路由管理源码分析

    这篇文章主要为大家介绍了java开发中RocketMQ之NameServer路由管理源码分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11

最新评论