文章目录
  1. 1. 提要
  2. 2. 步骤
  3. 3. 运行结果:
  4. 4. 总结:

提要

之前的一片文章讲解了同步回调的机制,本文就在前文的基础上讲解一下异步回调过程。

步骤

收先定义了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

文章目录
  1. 1. 提要
  2. 2. 步骤
  3. 3. 运行结果:
  4. 4. 总结:
Fork me on GitHub