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异步任务已经开始,请等待完成...");
}
}
运行结果:
准备开始执行异步任务...
正在执行耗时操作...
上下文信息
异步任务已经开始,请等待完成...
执行完成!
成功后的回调函数...
上下文信息
java 中的异步回调的更多相关文章
- Android Binder机制中的异步回调
“Binder通信是同步而不是异步的”,但是在实际使用时,是设计成客户端同步而服务端异步. 看看Framwork层的各service类java源码便会知道,在客户端调用服务端的各种方法时,通常会传递一 ...
- 如何优雅的处理Nodejs中的异步回调
前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...
- java中的接口回调
[接口回调]接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中 ...
- ArcGIS中使用异步回调函数查询图层Graphic
在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的Graphics比如我们在做的交警的项目中通过框选来查找某一块区域中的摄像机,某一块区域中的警力.警情.警员等相 ...
- java中jna使用回调实现事件监听器——观察者模式
(1)C接口中的接口头文件 #pragma once #include <iostream> #include <vector> #include <core/core. ...
- Java中的异步通知
在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了". 程序是自上而下顺序执行 ...
- nodejs中的异步回调机制
1.再次clear Timer定时器的作用 setTimeOut绝非是传统意义上的“sleep”功能,它做不到让主线程“熄火”指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长 ...
- java中的异步处理和Feature接口(一)
背景介绍想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道.为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它 ...
- java中同步异步阻塞和非阻塞的区别
同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特 ...
随机推荐
- xdebug + wincachegrind
;;;;;;;php.ini;;;;;;;;;;;;;;;;;; [Xdebug]zend_extension=D:\Xampp\php\ext\php_xdebug.dll;开启自动跟踪xdebug ...
- WPF学习之路(二) XAML(续)
属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors. ...
- Java Security:keytool工具使用说明
Keytool用法说明 Keytool是一个key与cert的管理工具.使用keytool可以管理public key.private key,以及与key之相关的certificate. 1.com ...
- SQL中JOIN 的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
- wc
$wc [-lwc] filename统计的文件的信息,缺省参数会按照lwc的顺序输出全部三种信息 -l统计文件的行数 -w统计文件的字数,字以空格和换行符分隔 -c统计文件的字符数,包括换行等 例子 ...
- linux 查看静态库,动态库是32位还是64位
动态库: file xxx.so 静态库 objdump -a xxx.a
- cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题
最近在解决XSS注入的问题,由于使用的servlet版本是2.5,不支持httpOnly的属性,故做了个工具类来实现cookie的httpOnly的功能.全类如下: /** * cookie工具类,解 ...
- 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.
支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.
- javascript刷新父页面的内容
适应于超级链接和弹出窗口 function RefreshParent() { if (window.opener != null) { ...
- windows下 MySQL手动安装与卸载
下载文件以后进行解压 ,指定文件的具体位置 1.安装 选择路径下的mysqld --intall 指定服务名称 --设置配置文件 例子: C:\Users\Administrator\Desktop ...