回调函数,顾名思义,用于回调的函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。

回调原本应该是一个非常简单的概念,但是可能因为平时只用系统为我们写好的回调的接口了,自己很少实现回调,所以在自己实现回调的时候还是有一点点晕的,现在写这篇文章记录一下,也和大家分享一下怎么写回调接口。

回调

回调的概念:举个例子就是,我们想要问别人一道题,我们把题跟对方说了一下,对方说好,等我做完这道题,我就告诉你,这个时候就用到了回调,因为我们并不知道对方什么时候会做完,而是对方做完了来主动找我们。

同步回调

代码运行到某一个位置的时候,如果遇到了需要回调的代码,会在这里等待,等待回调结果返回后再继续执行。

异步回调

代码执行到需要回调的代码的时候,并不会停下来,而是继续执行,当然可能过一会回调的结果会返回回来。

总体的代码还是很简单的,就是模拟了一个打印机,还有一个人,打印机具有打印的功能,但是打印需要时间,不能在收到任务的同时给出反馈,需要等待一段时间才能给出反馈。
这个人想做的就是打印一份简历,然后知道打印的结果。这里面代码实现了这两种方式。

具体代码:
Callback.java

public interface Callback {void printFinished(String msg);
}

Printer.java

public class Printer {public void print(Callback callback) {System.out.println("正在打印 . . . ");try {Thread.currentThread();Thread.sleep(3000);// 毫秒} catch (Exception e) {e.printStackTrace();}callback.printFinished("打印完成");}
}

People.java

public class People {Printer printer = new Printer();/** 同步回调*/public void goToPrintSyn(Callback callback) {printer.print(callback);}/** 异步回调*/public void goToPrintASyn(Callback callback) {new Thread(new Runnable() {public void run() {printer.print(callback);}}).start();}
}

Main.java 测试类,同步回调

public class Main {// 测试类,同步回调public static void main(String[] args) {People people = new People();Callback callback = new Callback() {@Overridepublic void printFinished(String msg) {System.out.println("打印机告诉我的消息是 ---> " + msg);}};System.out.println("需要打印的内容是 ---> " + "打印一份简历");people.goToPrintSyn(callback);System.out.println("我在等待 打印机 给我反馈");}
}
需要打印的内容是 ---> 打印一份简历
正在打印 . . .
打印机告诉我的消息是 ---> 打印完成
我在等待 打印机 给我反馈

Main.java 测试类,异步回调

public class Main {// 测试类,异步回调public static void main(String[] args) {People people = new People();Callback callback = new Callback() {@Overridepublic void printFinished(String msg) {System.out.println("打印机告诉我的消息是 ---> " + msg);}};System.out.println("需要打印的内容是 ---> " + "打印一份简历");people.goToPrintASyn(callback);System.out.println("我在等待 打印机 给我反馈");}
}
需要打印的内容是 ---> 打印一份简历
我在等待 打印机 给我反馈
正在打印 . . .
打印机告诉我的消息是 ---> 打印完成

java 回调的原理与实现相关推荐

  1. 【Android】Java回调原理并结合Android源码进行理解

    回调机制是一种常见的设计模式,它把工作流内的某个功能按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据. 之前对于回调一直是一知半解,而且总是停留在C++的函数指针的理解之 ...

  2. 关于Java“回调”的详细理解及使用

    本文由"言念小文"原创,转载请说明文章出处 一.前言 接触java快六年了,从事软件开发工作也三年多了.感谢那些知名或不知名的大神一篇篇精彩博文,帮助我 从一个开发小白一步步成长为 ...

  3. 10分钟看懂, Java NIO 底层原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 写在前面 ...

  4. Java NIO 底层原理详解

    写在前面 很多的小伙伴,被java IO 模型,搞得有点儿晕,一会儿是4种模型,一会儿又变成了5种模型. 很多的小伙伴,也被nio这个名词搞晕了,一会儿java 的nio 不叫 非阻塞io,一会儿ja ...

  5. Java回调函数理解和应用

    #Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...

  6. Java 动态代理原理图解 (附:2种实现方式详细对比)

    动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 Ja ...

  7. 10分钟看懂 Java NIO 底层原理

    写在前面 很多的小伙伴,被java IO 模型,搞得有点儿晕,一会儿是4种模型,一会儿又变成了5种模型. 很多的小伙伴,也被nio这个名词搞晕了,一会儿java 的nio 不叫 非阻塞io,一会儿ja ...

  8. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  9. Java并发编程原理与实战六:主线程等待子线程解决方案

    Java并发编程原理与实战六:主线程等待子线程解决方案 参考文章: (1)Java并发编程原理与实战六:主线程等待子线程解决方案 (2)https://www.cnblogs.com/pony1223 ...

最新文章

  1. seaborn使用violinplot函数可视化分组小提琴图(Grouped Violinplot with Seaborn violinplot)并保存可视化结果
  2. 对typedef void (*sighandler_t)(int)的理解(声明了一种类型:sighandler_t)
  3. Swiper使用心得
  4. HTML5网页APP连接MQTT,使用js连接mqtt
  5. 深入理解C# 3.x的新特性(2):Extension Method[下篇]
  6. 当动物保护用上AI……
  7. JS进阶篇--JS数组reduce()方法详解及高级技巧 1
  8. 欢迎使用CSDN-markdown编辑器--样例
  9. 跨域的小小总结:js跨域及跨域的几种解决方法
  10. Bug人生---初看windows核心编程有感
  11. Java初学练手,一款汽车车牌号生成小工具
  12. 全国三级流域空间分布矢量数据下载方式
  13. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  14. 【Zotero】使用坚果云同步PC端和IOS端
  15. 【UE4】UE4框选
  16. 天天向上的力量---python持续的力量
  17. 字节跳动2019届校招笔试题
  18. PHP 可以利用的危险的函数
  19. 使用cmd命令窗口打开对应的应用程序
  20. 芯科发布EFR32BG22芯片,强劲性能对比TI芯片CC2640R2F和CC2640R2L

热门文章

  1. 百度2021年武汉高考成绩查询,武汉学霸高考725分 2020高考百度App、支付宝和微信查分方法...
  2. 【PMP考纲解读】【人】任务—冲突管理
  3. python爬取股吧评论_神级的爬虫工程师用Python教你爬取全站股票评论!买哪只有底呢!...
  4. python乘号的字符代码_python 命令行参数传入 乘号(*) 时出错
  5. FlexBuilder优化技巧
  6. 2-23财财的财经早报
  7. html设置顶边距,html整体页面边距怎么设置
  8. vue组件之间传值的几种方式
  9. 利用java8特性Stream流对list集合进行多个属性组装数据
  10. can协议crc计算_基于CAN总线的CRC校验码的原理与实现