软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础

回调你可以这样来理解:

A发送消息给B,B处理好A要求的事情后,将结果返回给A,A再对B返回的结果来做进一步的处理。

A、回调的实现

/**

* 回调接口

* @author KOOK

*

*/

public interface CallBack {

/**

* 执行回调方法

* @param objects将处理后的结果作为参数返回给回调方法

*/

public void execute(Object... objects );

}

B、消息的发送者

/**

* 简单本地发送异步消息的类

* @author KOOK

*

*/

public class Local implements CallBack,Runnable{

/**

* 远程接收消息的类,模拟point-to-point

*/

private Remote remote;

/**

* 发送出去的消息

*/

private String message;

public Local(Remote remote, String message) {

super();

this.remote = remote;

this.message = message;

}

/**

* 发送消息

*/

public void sendMessage()

{

/**当前线程的名称**/

System.out.println(Thread.currentThread().getName());

/**创建一个新的线程发送消息**/

Thread thread = new Thread(this);

thread.start();

/**当前线程继续执行**/

System.out.println("Message has been sent by Local~!");

}

/**

* 发送消息后的回调函数

*/

public void execute(Object... objects ) {

/**打印返回的消息**/

System.out.println(objects[0]);

/**打印发送消息的线程名称**/

System.out.println(Thread.currentThread().getName());

/**中断发送消息的线程**/

Thread.interrupted();

}

public static void main(String[] args)

{

Local local = new Local(new Remote(),"Hello");

local.sendMessage();

}

public void run() {

remote.executeMessage(message, this);

}

}

C、远程消息的接收者

/**

* 这个类相当于你的同学

*/

public class Remote {

/**

* 处理消息

* @param msg   接收的消息

* @param callBack  回调函数处理类

*/

public void executeMessage(String msg,CallBack callBack)

{

/**模拟远程类正在处理其他事情,可能需要花费许多时间**/

for(int i=0;i<1000000000;i++)

{

}

/**处理完其他事情,现在来处理消息**/

System.out.println(msg);

System.out.println("I hava executed the message by Local");

/**执行回调**/

callBack.execute(new String[]{"Nice to meet you~!"});  //这相当于同学执行完之后打电话给你

}

}

回调的好处之一:摒弃了继承抽象类方式的回调方式更加简便灵活

public abstract class B{

public void execute(){

getConnection();

doCRUD();

releaseConnection();

}

public abstract void doCRUD();

public void getConnection(){

System.out.println("获得连接...");

}

public void releaseConnection(){

System.out.println("释放连接...");

}

}

public class A extends B{

public void doCRUD(){

System.out.println("执行add操作...");

}

public void add(){

doCRUD();

}

}

public class C extends B{

public void doCRUD(){

System.out.println("执行delete操作...");

}

public void delete(){

doCRUD();

}

}

如果改为回调实现是这样的

interface CallBack{

public void doCRUD();

}

public class HibernateTemplate {

public void execute(CallBack action){

getConnection();

action.doCRUD();

releaseConnection();

}

public void add(){

execute(new CallBack(){

public void doCRUD(){

System.out.println("执行add操作...");

}

});

}

public void delete(){

execute(new CallBack(){

public void doCRUD(){

System.out.println("执行delete操作...");

}

});

}

public void getConnection(){

System.out.println("获得连接...");

}

public void releaseConnection(){

System.out.println("释放连接...");

}

}

java crud事件回调_java回调机制 - 神是到着念的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java常用的缓存_java 常用缓存 - 只对肉有感觉的个人空间 - OSCHINA - 中文开源技术交流社区...

    缓存是日常开发的粗茶淡饭,如果应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能 JVM 缓存 使用全局变量,如 Map.List等容器用于存放数据,可以认为是堆缓存 eh ...

  2. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...

    在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...

  3. java中类型转换的造型_Java-类型转换 - 吉胖子很瘦的个人空间 - OSCHINA - 中文开源技术交流社区...

    类型转换 在实际开发过程中,存在类型转换,类型转换分为两种,自动类型转换和强制类型转换. 自动类型转换 程序编译或运行过程中,jvm可以发生自动类型转换.转换规则: [1]容量小的数据类型可以自动转换 ...

  4. java下拉框及响应函数_MVC 实现下拉框 - osc_88wjsceo的个人空间 - OSCHINA - 中文开源技术交流社区...

    MVC动态实现下拉框的方式有很多种,但是方便快捷的却是很少,现在记录一种常用的下拉框实现方式: 1.先看看视图代码是怎么写的 这是一个下拉框: @Html.DropDownList("sel ...

  5. java完成九宫格数独_数独(简易九宫格) - 小黑202的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.ViewController.h中代码 // //  ViewController.h //  ThirdSignleView // //  Created by on 15/6/10. //   ...

  6. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  7. java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...

  8. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  9. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区

    所谓的原子量即操作变量的操作是"原子的",该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过vola ...

最新文章

  1. java 冒泡排序和快速排序 实现
  2. node java php_服务端I/O性能:Node、PHP、Java、Go的对比
  3. js全局变量和局部变量
  4. ms SQL Server表自增字段重置
  5. win7下安装Oracle10g解决方案
  6. 机器学习(machine learning)之AdaBoost算法
  7. std::string中的反向迭代器rbegin()和rend()
  8. Java效率工具之Swagger2
  9. 操作系统中分页、分段、交换空间、页面置换算法等相关概念
  10. IDEA中Maven项目中界面右边的Maven Projects窗口找不到不出来
  11. (@WhiteTaken)设计模式学习——代理模式
  12. Web/前端性能优化
  13. 西刺代理python_手把手教你使用Python爬取西刺代理数据(下篇)
  14. Vue select默认选中第一个
  15. 4G和4G LTE之间的区别是什么?
  16. “四通一达”本一家,这家人是如何“承包”中国快递半壁江山的?
  17. angular2 mysql_零起步学习angular2_angularjs教程_汇智网
  18. [C++]H106OJ-第二周练习总结
  19. 冰天雪地摄影技巧创意色彩指南
  20. springboot+jsp项目校园外卖配送系统

热门文章

  1. c mysql日期时间格式_mysql日期和时间类型
  2. python做算法题优势_Python语言在科学算法中的优势
  3. 多少秒算长镜头_下中国象棋,能算多少步才算高手?
  4. Matlab各种拟合
  5. Matlab求欧式距离
  6. java虚拟机常用命令工具
  7. html的扇形代码导航,CSS3--利用transform和transition属性制作扇形导航
  8. 【算法图解|2】JavaScript 如何实现数组扁平化
  9. python怎么改目录_如何查看文件,而不是使用Python进行更改的目录?
  10. React 学习笔记 —— Ref Hook