Java 回调机制
Java 回调机制
在Java核心技术I中接触到了回调这个名词,在这里整理下思路。
1、方法调用的三种方式
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
- 同步调用:即阻塞调用,单向,是最基本并且最简单的一种调用方式,方法 a() 调用方法 b() ,等到 方法 b() 执行完后才继续执行方法 a().
- 异步调用:即通过异步消息进行通知,通过方法 a() new 一个线程调用方法 b() , 例如微信消息推送的情景。
- 回调:即双向,调用 + 反调。类A的a()方法调用类B的b()方法, 类B的b()方法执行完毕主动调用类A的callback()方法。
2、例子演示
一个员工做完了手头的工作,发送消息通知,得到回复才可以走人(笑了)。
2.1、回调接口类
/**
* 回调模式-回调接口类
*/
public interface Work {
void goHome(String content);
}
2.2、员工工作类,实现回调接口
/**
* 回调模式-员工工作类,实现回调接口类
*/
public class EmployeeWork implements Work{
/**
* 异步调用,发送完成工作的消息
*
* @param content 消息
* @param message 消息处理类
*/
public void complete(final String content, final Message message){
//创建线程
new Thread(() -> {
//将员工工作的引用传入消息处理的方法
message.ask(content, EmployeeWork.this);
}).start();
waiting();
}
/**
* 准备回家
*/
public void waiting() {
System.out.println("准备回家");
}
/**
* 被回调方法,得到消息可以回家了
* @param content
*/
@Override
public void goHome(String content) {
System.out.println("得到通知," + content + "工作,可以下班了");
}
}
2.3、消息处理类,这里回调方法。
/**
* 回调模式-消息处理类,回调方法
*/
public class Message {
/**
* 处理消息并回调
*
* @param content 消息
* @param work 回调接口,为了安全向上转型
*/
public void ask(String content, Work work) {
if (content.contains("完成")) {
System.out.println("收到" + content + "的通知");
//回调方法
work.goHome(content);
}
}
}
2.4、测试类
public class CallBackTest {
public static void main(String[] args) {
EmployeeWork employeeWork = new EmployeeWork();
String content = "完成微信推送";
employeeWork.complete(content, new Message());
}
}
输出结果如下:
准备回家
收到完成微信推送的通知
得到通知,完成微信推送工作,可以下班了
2.5、小结
以上是异步回调的简单示例,回调方法最大的优势在于就在于异步回调,这是其最被广为使用的原因。
3、应用场景
- Windows平台的消息机制。
- 异步调用微信接口,根据微信返回状态对出业务逻辑响应。
- Servlet中的Filter(过滤器)是基于回调函数,需容器支持。
4、回调的步骤
- A类实现接口CallBack callback。
- A类中包含了一个B的引用。
- B中有一个参数为CallBack的方法f(CallBack callback)。
- 在A类中调用B的方法f(CallBack callback)——注册回调接口。
- B就可以在f(CallBack callback)方法中调用A的方法——调用回调接口。
参考文章:Java并发编程网
参考博客:https://blog.csdn.net/qq_31749835/article/details/90073185
自我控制是最强者的本能-萧伯纳