天天看点

java 中的异步回调

java 中的异步回调

异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图:

java 中的异步回调

先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作,然而真正干活的是CallBackBody,它里面的execute才是真正要处理的事情,如果成功,则触发onSucess,否则触发onFailure。

CallBackApp做为最终的运行舞台,这里面还得单独跑一个线程,来启动CallBackTask,这样才不会阻塞后面的处理。

CallBackBody:

package com.cnblogs.yjmyzz.test.callback;


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:

package com.cnblogs.yjmyzz.test.callback;

public class CallBackTask {
    private CallBackBody body;

    public CallBackTask(CallBackBody body) {
        this.body = body;
    }

    protected void start(final Object context) {
        final Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    body.execute(context);
                } catch (Exception e) {
                    e.printStackTrace();
                    body.onFailure(context);
                }
                body.onSuccess(context);
            }
        });
        t.start();
    }
}
      

最后测试一把:

CallBackApp:

package com.cnblogs.yjmyzz.test.callback;


/**
 * Created by jimmy on 8/13/15.
 */
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执行完成!");
            }

            void onSuccess(Object context) {
                System.out.println("\n成功后的回调函数...");
                System.out.println(context);
            }

            void onFailure(Object context) {
                System.out.println("\n失败后的回调函数...");
                System.out.println(context);
            }
        }).start(context);

        System.out.println("\n异步任务已经开始,请等待完成...");
    }
}
      

作者:菩提树下的杨过

出处:javascript:void(0)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。