Java回调机制(异步)
2016-01-03 16:22
435 查看
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:
1)Class A实现接口CallBack callback——背景1
2)class A中包含一个class B的引用b ——背景2
3)class B有一个参数为callback的方法f(CallBack callback) ——背景3
4)A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
5)然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
大家都喜欢用打电话的例子,好吧,为了跟上时代,我也用这个例子好了,我这个例子采用异步加回调
有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2
客户端发送msg给服务端,服务端处理后(5秒),回调给客户端,告知处理成功。代码如下:
回调接口类:
模拟客户端:
模拟服务端:
测试类:
运行下测试类 — 打印结果如下:
客户端:发送的消息为:Server,Hello~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态 200
客户端:服务端回调状态为:200
1、接口作为方法参数,其实际传入引用指向的是实现类
2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。
另一篇比较好的讲解:http://blog.csdn.net/xiaanming/article/details/8703708/
1)Class A实现接口CallBack callback——背景1
2)class A中包含一个class B的引用b ——背景2
3)class B有一个参数为callback的方法f(CallBack callback) ——背景3
4)A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
5)然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
大家都喜欢用打电话的例子,好吧,为了跟上时代,我也用这个例子好了,我这个例子采用异步加回调
有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2
客户端发送msg给服务端,服务端处理后(5秒),回调给客户端,告知处理成功。代码如下:
回调接口类:
public interface CSCallBack { public void process(String status); }
模拟客户端:
public class Client implements CSCallBack { private 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() { server.getClientMsg(Client.this,msg); } }).start(); System.out.println("客户端:异步发送成功"); } @Override public void process(String status) { System.out.println("客户端:服务端回调状态为:" + status); } }
模拟服务端:
public class Server { public void getClientMsg(CSCallBack csCallBack , String msg) { System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg); // 模拟服务端需要对数据处理 try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("服务端:数据处理成功,返回成功状态 200"); String status = "200"; csCallBack.process(status); } }
测试类:
public class CallBackTest { public static void main(String[] args) { Server server = new Server(); Client client = new Client(server); client.sendMsg("Server,Hello~"); } }
运行下测试类 — 打印结果如下:
客户端:发送的消息为:Server,Hello~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态 200
客户端:服务端回调状态为:200
1、接口作为方法参数,其实际传入引用指向的是实现类
2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。
另一篇比较好的讲解:http://blog.csdn.net/xiaanming/article/details/8703708/
相关文章推荐
- Java学习----到底调用哪一个方法(多态)
- eclipse启动找不到javaw.exe
- 深入解析Java编程中final关键字的使用
- java的throw和throws
- Java学习----方法的覆盖
- 【LWJGL2 WIKI】【辅助库篇】Slick-Util库:第一部分-读取图片
- hibernate复合主键中为什么要复写equals和hashcode方法?还要implement Serializable?
- Java IO流文件操作
- 深入解析Java的Hibernate框架中的一对一关联映射
- 【LWJGL2 WIKI】【辅助库篇】Slick-Util库:介绍
- Thinking in Java-笔记
- springMVC笔记(一) Controller的实现和配置(一)
- Spring AOP中pointcut expression表达式解析
- java实现的简单网页爬虫:Servlet + MySQL5.5
- 全面解析Java注解
- Java学习----对象间的继承
- struts2实现文件下载
- Windows下JDK版本设置
- java类写入日志和定时删除日志
- java replaceall 用法