1. 什么是回调函数
回调函数(callback Function),顾名思义,用于回调的函数。 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性:
1、属于工作流的一个部分;
2、必须按照工作流指定的调用约定来申明(定义);
3、他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;
精髓:由用户按照回调函数调用约定来实现的一个函数。
摘选自《Hibernate》回调函数的示例
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("释放连接...");
}
public static void main (String[] args)
{
HibernateTemplate ht=new HibernateTemplate();
ht.add();
ht.delete();
}
}
我们用回调函数写一个 简单 任务监听器 我在做一个任务,不知道要花多少时间,但是任务完成后一定会通知监听器。
import java.util.Random;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//监听器
Task.Listen listen = new Task.Listen() {
@Override
public synchronized boolean finsh(Task t) {
// TODO Auto-generated method stub
System.out.println(t.getName() + "任务完成");
return false;
}
};
//任务
Task t = new Task() {
@Override
protected void dotask() {
//.................do anything
System.out.println(this.getName()+"正在执行一个任务");
int x=new Random().nextInt(1000)+500;
try {
Thread.sleep(x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("等待了"+x+"毫秒");
//.................do anything
}
};
t.setName("java");
//设置监听器
t.setListen(listen);
Thread thread=new Thread(t);
thread.start();
}
}
abstract class Task implements Runnable {
public interface Listen {
boolean finsh(Task t);
}
public String name;
public Listen listen;
@Override
public void run() {
// TODO Auto-generated method stub
//.................do anything
dotask();
//回调
if (listen != null)
listen.finsh(this);
}
protected abstract void dotask();
public Listen getListen() {
return listen;
}
public void setListen(Listen listen) {
this.listen = listen;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}