java 中的异步回调

异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在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异步任务已经开始,请等待完成...");
    }
}

运行结果:

准备开始执行异步任务... 正在执行耗时操作... 上下文信息 异步任务已经开始,请等待完成... 执行完成! 成功后的回调函数... 上下文信息

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

for 循环,while循环,break,continue,exit

38680
来自专栏Java架构沉思录

聊聊Java动态代理(上)

前言 在之前的文章《聊聊设计模式之代理模式》中,笔者为大家介绍了代理模式,在这里简单回顾一下。代理模式的作用是提供一个代理来控制对一个对象的访问,因此我们可以...

373130
来自专栏博客园

Redis命令与配置

    slaveof  127.0.0.1 6379(设置Mater的Host以及Port)

17040
来自专栏Deep learning进阶路

C++随记(九)---名称空间

C++随记(九)---名称空间 C++中,名称可以是变量、函数、结构、类等等,项目增大会使得名称冲突的可能性增大,人类可用的单词数太少,并且不同的人写的程序不可...

19100
来自专栏技巅

Thrift之代码生成器Compiler原理及源码详细解析3

25860
来自专栏与神兽党一起成长

使用FTP连接池封装工具类

早前的思路是将FTP连接的管理(对象池功能)与FTP工具类(上传下载方法)在一个工程中实现,在工具类中调用是模板类提供的模板方法, 由模板方法与对象池打交道——...

31820
来自专栏电光石火

获取URL地址中的GET参数

/*-----------------实现1--------------------*/ function getPar(par){ //获取当前URL...

26490
来自专栏杨建荣的学习笔记

Python基础之os和数据结构

今天总结了下Python的基础,发现还是有很多基础需要巩固,直接把学习的内容放上来。 >>> import os 得到当前的所在的路径 >>> os.getcw...

36260
来自专栏武军超python专栏

2018年7月23日数据存储到文件中的代码介绍:

******************************************************************

11050
来自专栏电光石火

获取URL地址中的GET参数

/*-----------------实现1--------------------*/ function getPar(par){ //获取当前URL...

22190

扫码关注云+社区

领取腾讯云代金券