【java回调】同步/异步回调机制的原理和使用方法
回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法。
回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果。再简单点就是A调用B,B调用A。
那么是如何实现的呢?一般而言,处理消息的类是唯一的,而发送消息的类却是各种各样的,所以一般的做法是将回调方法做成一个接口,不同的发送者去实现该接口,并且把自己的接口实现类的对象在发送消息时传递给消息处理者。
(现在不太方便画图,之后再补上图)
现在以一个CS结构的示例来说明回调的过程:
Client类:
package com.test.callback; /**
* Created by puyangsky on 2016/6/13.
*/
public class Client {
Server server;
public Client(Server server) {
this.server = server;
}
public void sendMsg(final String msg) {
System.out.println("客户端正在发生消息:" + msg);
new Thread(new Runnable() {
@Override
public void run() {
try {
//调用server类的获取消息方法,并且传入myCallback对象
server.getMsg(new myCallback(), msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
//实现Callback接口
private class myCallback implements Callback {
@Override
public void process(int status) {
System.out.println("处理成功,返回状态为:" + status);
}
}
}
回调接口类:
interface Callback {
void process(int status);
}
Server类:
package com.test.callback; /**
* Created by puyangsky on 2016/6/13.
*/
public class Server {
public void getMsg(Callback callback, String msg) throws InterruptedException {
System.out.println("服务端获得消息:" + msg);
//模拟处理消息过程,等待两秒
Thread.sleep(2000);
System.out.println("服务端处理成功,返回状态为200");
//处理完消息,调用回调方法,告知客户端
callback.process(200);
}
}
测试类:
package com.test.callback; /**
* Created by Administrator on 2016/6/13.
*/
public class CallbackTest {
public static void main(String[] args) {
Server server = new Server();
Client client = new Client(server);
client.sendMsg("hello");
}
}
输出结果:

上述代码完成的过程是模拟异步回调,回调分为同步和异步,区别就是需不需要等待服务器端的返回结果,本例中在客户端发送消息时加入了线程执行,就体现了异步。
感悟:
1、对回调机制要知其然知其所以然,用起来才更加顺手;
2、在自己做设计时碰到合适的场景也应该考虑采用同步或者异步的回调机制。
【java回调】同步/异步回调机制的原理和使用方法的更多相关文章
- js同步-异步-回调
出处:https://blog.csdn.net/u010297791/article/details/71158212(1)上面主要讲了同步和回调执行顺序的问题,接着我就举一个包含同步.异步.回调的 ...
- C++屌屌的观察者模式-同步回调和异步回调
目录 一.概述 1.同步观察者 2.异步观察者 二.效果展示 三.同步观察者 四.异步观察者 五.相关文章 原文链接:C++屌屌的观察者模式-同步回调和异步回调 一.概述 说起观察者模式,也是比较简单 ...
- C# 同步 异步 回调 状态机 async await Demo
源码 https://gitee.com/s0611163/AsyncAwaitDemo 为什么会研究这个? 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者 ...
- 前端笔记之JavaScript(九)定时器&JSON&同步异步/回调函数&函数节流&call/apply
一.快捷位置和尺寸属性 DOM已经提供给我们计算后的样式,但是还是觉得不方便,因为计算后的样式属性值都是字符串类型. 不能直接参与运算. 所以DOM又提供了一些API:得到的就是number类型的数据 ...
- 支付回调地址 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]JSAPI支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10 退款结果通知 ...
- java 中的异步回调
异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...
- 通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7 通知url必须为直接可访问的 ...
- C#--委托的同步,异步,回调函数
原文地址 同步调用 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. using System; using System. ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
随机推荐
- iOS 隐藏导航栏下的黑线
一.找到导航栏下的黑线 // 寻找导航栏下的黑线 - (UIImageView *)findHairlineImageViewUnder:(UIView *)view { if ([view isKi ...
- web api 支持cors
1. configservice //******************* cors start *********************** var urls = Configuration[S ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- SpringBoot Mybatis 读写分离配置(山东数漫江湖)
为什么需要读写分离 当项目越来越大和并发越来大的情况下,单个数据库服务器的压力肯定也是越来越大,最终演变成数据库成为性能的瓶颈,而且当数据越来越多时,查询也更加耗费时间,当然数据库数据过大时,可以采用 ...
- 【洛谷 P4735】 最大异或和 (可持久化Trie)
题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...
- Grunt构建工具
Grunt是javascript的构建工具,对于需要反复重复的任务,例如压缩(minification).编译.单元测试.linting等,自动化工具可以简化工作.Grunt生态系统非常庞大.你可以利 ...
- ThinkPHP3.1.3 整合 UEditor百度编辑器 图片上传
第一步.前端模板实例化百度编辑器 <js file='__ROOT__/Data/UEditor/ueditor.config.js' /> <js file='__ROOT__/D ...
- 网络知识===wireshark抓包,三次握手分析
TCP需要三次握手建立连接: 网上的三次握手讲解的太复杂抽象,尝试着使用wireshark抓包分析,得到如下数据: 整个过程分析如下: step1 client给server发送:[SYN] Seq ...
- DNS解析原理与Bind部署DNS服务
DNS是什么? DNS(Domain Name System,域名系统)是互联网上最核心的带层级的分布式系统,它负责把域名转换为IP地址.反查IP到域名的反向解析以及宣告邮件路由等信息,使得基于域名提 ...
- 关于JqueryEasyUI插件—Tab,默认选中某个面板 如果不明显指定的话,第一个就是被选中的
如果不明显指定的话,第一个就是被选中的,你可以通过data-options="selected:true"指定默认选中