Java回调之异步回调
提要
之前的一片文章讲解了同步回调的机制,本文就在前文的基础上讲解一下异步回调过程。
步骤
收先定义了CallBackTask,做为外层的面子工程,其主要工作为start ,开始一个异步操作。真正干活的是CallBackBody,它里面的execute执行要处理的事情,如果成功,则触发onSucess,否则触发onFailure。
CallBackApp做为最终的运行舞台,这里面还得单独跑一个线程,来启动CallBackTask,这样才不会阻塞后面的处理。
CallBackBody:
public abstract class CallBackBody {
void onSuccess(Object context) {
System.out.println("onSuccess方法执行");
}
void onFailure(Object context) {
System.out.println("onFailure方法执行");
}
abstract void execute(Object context) throws Exception;
}
CallBackTask:
public class CallBackTask {
private CallBackBody callBackBody;
public CallBackTask(CallBackBody callBackBody) {
this.callBackBody = callBackBody;
}
protected void start(final Object context) {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
callBackBody.execute(context);
} catch (Exception e) {
callBackBody.onFailure(context);
e.printStackTrace();
}
callBackBody.onSuccess(context);
}
});
thread.start();
}
}
最后测试一把:
CallBackApp:
public class CallBackApp {
public static void main(String[] args) {
System.out.println("=======准备开始执行异步任务=========");
final Object context = "上下文信息";
new CallBackTask(new CallBackBody() {
@Override
void execute(Object context) throws Exception {
System.out.println("\n正在执行耗时操作...");
System.out.println(context);
Thread.sleep(5000);
System.out.println("\n执行完成!");
}
@Override
void onFailure(Object context) {
System.out.println("\n失败后的回调函数...");
System.out.println(context);
}
@Override
void onSuccess(Object context) {
System.out.println("\n成功后的回调函数...");
System.out.println(context);
}
}).start(context);
System.out.println("==========异步任务已经开始请等待完成==========");
}
}
运行结果:
总结:
异步调用在应用程序框架中具有广泛的应用,并且特指多线程情况下。它同Windows的消息循环机制,消息响应,消息队列,事件驱动机制以及设计模式中的观察者模式等都是紧密相关的。 在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。
回调函数用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,它将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装。这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。 其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
参考文章:http://blog.csdn.net/kobejayandy/article/details/17654967