网上很多例子都写的很难理解,笔者刚开始都已经弄晕菜了。

这个例子,应该是再简单,再简洁不过的了,例子目的是测试某个方法的执行时间。这里就写三个java类,一个接口,一个实现,还有一个用于测试时间的类。

要测试的方法,尽量占用执行的时间,这样明显一些,这里测试循环1000000次,并且打印出来。

测试类:

public class MyMethod {

    public void mytest() {
// TODO Auto-generated method stub
for (int i = 0; i < 1000000; i++) {
System.out.println("num:"+i);
}
}
}

接口CallBack:

public interface CallBack {
void execute();
}

实现类:

public class TestTime {
public void testTime(CallBack callBack){
long begin=System.currentTimeMillis();
System.out.println("begin time:"+begin);
callBack.execute();
long end=System.currentTimeMillis();
System.out.println("end time:"+end);
System.out.println("use time:"+(end-begin));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestTime TT=new TestTime();
TT.testTime(new CallBack() {
@Override
public void execute() {
// TODO Auto-generated method stub
(new MyMethod()).mytest(); //执行测试方法
}
});
}
}

控制台会输出:

......

num:999998
num:999999
end time:1403838433171
use time:8093

好了,这就实现回调了。

刚接触这个的,会觉得,这就是实现回调了?

笔者对回调的大致理解是:A调用了B,执行后,B又调用A。上面的实现类是写在了一起。主类(A)的main方法调用了主类中的testTime方法(这个testTime可以单独写到一个类(B)中,就相当于B类中的方法,只不过这里写到了一起),所以可以简单理解为A调用了B。然后B又调用了A中的测试方法MyMethod.mytest()方法(消耗了很久时间,并且B自己计算了时间)。

这样,大概就理解了吧。

使用回调有什么好处呢?

好处大概就是只关心自己的业务,不用在乎其它的东西。就像上面,计算方法执行时间的类,只需要调用一下它就好了,不用去管他是如何来执行,如何来实现那个计算方法的。如果用过jdbcTemplate的话,应该更容易理解一些。jdbctemplate也是使用回调的,用户只需要关心对自己对象的操作,而不用关心其他的,比如连接数据库,执行sql语句等问题。

推而广之,我们大概可以写一个jdbctemplate的简单模型,比如数据库的更新插入操作。

Callback的接口:

import com.mysql.jdbc.PreparedStatement;

public interface PreparedStatementSetter {
public void setValues(PreparedStatement ps);
}

更新的方法:

import com.mysql.jdbc.PreparedStatement;

public class JdbcTemplate {
public void update(String sql,PreparedStatementSetter pss) throws SQLException{
PreparedStatement preparedStatement=null;
preparedStatement.execute(sql);
}
}

我们自己的方法去实现:

import java.sql.SQLException;

import com.mysql.jdbc.PreparedStatement;

public class Main {
public Main() throws SQLException {
// TODO Auto-generated constructor stub
JdbcTemplate jdbcTemplate=new JdbcTemplate();
String sql="insert into table values(?,?)";
jdbcTemplate.update(sql, (new PreparedStatementSetter() { @Override
public void setValues(PreparedStatement ps) {
// TODO Auto-generated method stub }
}));
}
}

这和jdbctemplate是不是非常像,大概就是这么些。希望有助于很多像我一样对回调迷茫了很久的人。

一个例子教你理解java回调机制的更多相关文章

  1. 转:一个经典例子让你彻彻底底理解java回调机制

    一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...

  2. 一个经典例子让你彻彻底底理解java回调机制

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 所谓回调: ...

  3. 回调--一个经典例子让你彻彻底底理解java回调机制

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以前不理解什么叫回调 ...

  4. 理解java回调机制

    摘自:ImportNew 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类 ...

  5. 一个例子让你了解Java反射机制

    本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...

  6. 深入理解java回调机制

    Callback的定义 一般在程序中执行回调函数是,是知道回调函数是预留给系统调用的,而且知道该函数的调用时机. 比如说android应用定义一个button对象,并给按钮添加一个监听事件," ...

  7. Java回调机制总结

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  8. java回调机制及其实现(转)

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

  9. java回调机制(写的很好)

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 以前不理解什么叫回调,天天听人家说加一个回调方法啥的 ...

随机推荐

  1. CodeForces - 983B XOR-pyramid(区间dp,异或)

    XOR-pyramid time limit per test 2 seconds memory limit per test 512 megabytes input standard input o ...

  2. java之扫描包里面的class文件

    一.class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法.但是扫描class就是一个很大的问题了. 二.所以我这里写了一个简单的class文件扫描方式. 三.主要是利 ...

  3. C++ - memset的效率和源码分析

      void *memset(void *s, int ch, size_t n); 作用:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函 ...

  4. Xshell连接虚拟机突然被拒,提示再次输入密码。。。

    sudo vim /etc/ssh/sshd_config 将 # Authentication: LoginGraceTime 120 PermitRootLogin prohibit-passwo ...

  5. 好记性不如烂笔头--linux学习笔记9练手写个shell脚本

    #!/bin/bash #auto make install httpd #by authors baker95935 #httpd define path variable H_FILES=http ...

  6. Pthreads n 体问题

    ▶ <并行程序设计导论>第六章中讨论了 n 体问题,分别使用了 MPI,Pthreads,OpenMP 来进行实现,这里是 Pthreads 的代码,分为基本算法和简化算法(引力计算量为基 ...

  7. MPI 集合通信函数 MPI_Scatterv(),MPI_Gatherv(),MPI_Allgatherv(),MPI_Alltoall(),MPI_Alltoallv(),MPI_Alltoallw()

    ▶ 函数 MPI_Scatterv() 和 MPI_Gatherv() .注意到函数 MPI_Scatter() 和 MPI_Gather() 只能向每个进程发送或接受相同个数的元素,如果希望各进程获 ...

  8. 浅析JavaScript中的typeof运算符

    对JavaScript中的typeof运算符进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果typeof的运算符是数字.字符串或者布尔值,它返回的结果就是"numb ...

  9. C++Builder 内存泄露检测

    C++Builder 内存泄露检测 CodeGuard http://bbs.2cto.com/read.php?tid=179933 XE新版里 ReportMemoryLeaksOnShutdow ...

  10. 点赞功能实现 $(tag).css('属性', '样式')

    1. 创建标签 document.createElement() 2.$(tag).css('属性', 样式) 赋予标签属性样式 3.设置定时器 改变位置 大小 <!DOCTYPE html&g ...