博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java回调】同步/异步回调机制的原理和使用方法
阅读量:4183 次
发布时间:2019-05-26

本文共 1935 字,大约阅读时间需要 6 分钟。

回调(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、在自己做设计时碰到合适的场景也应该考虑采用同步或者异步的回调机制。

转载地址:http://hqzoi.baihongyu.com/

你可能感兴趣的文章
文科生北海糖的:Java之路——继承
查看>>
Makefile 中:= ?= += =的区别
查看>>
消灭编译警告(Warning)
查看>>
(GCC) How can I hide "defined but not used" warnings in GCC?
查看>>
错误: 隐式声明函数‘kmalloc’ [-Werror=implicit-function-declaration]
查看>>
error: two or more data types in declaration specifiers原因及解决方法
查看>>
Linux驱动基础开发2
查看>>
ioctl在socket中的一些用法及示例
查看>>
Linux设备驱动--块设备(二)之相关结构体
查看>>
Linux设备驱动--块设备(四)之“自造请求”
查看>>
Nand Flash和Nor Flash相关知识
查看>>
NAND flash和NOR flash的区别
查看>>
writeb(), writew(), writel(),readb(), readw(), readl() 宏函数
查看>>
NOR Flash擦写和原理分析
查看>>
51单片机程序执行流程(STARTUP.A51)
查看>>
原码, 反码, 补码 详解
查看>>
Java自学第一阶段(二)- 小试牛刀
查看>>
Java自学第一阶段(三)- 万能的变量
查看>>
Java自学第一阶段(四)-万能的变量(2)
查看>>
HashMap存储原理以及与hashcode、equals方法的关系
查看>>