文章目录
- Java 回调 (Callback) 接口学习使用
- 1.什么是回调(Callback)?
- 2.Java代码示例
- 2.直接调用
- 3.接口调用
- 4.Lambda表达式
推荐看我的InfoQ地址,界面排版更简洁
Java 回调 (Callback) 接口学习使用
1.什么是回调(Callback)?
回调函数,简称回调,是指通过函数参数传递到其他代码的某一块可执行代码的引用,这一设计允许了底层代码调用在高层定义的子程序。
简单来说:A调用了B的b()方法,那b方法如果包含对A中实现的逻辑的调用,这个过程就被称作回调。
2.Java代码示例
package callback;public class MQ {class Producer{public void send(String msg, MsgStateCallback msgStateCallback) {System.out.println("send msg :" + msg);int ACK = 1;if (ACK == 0){msgStateCallback.succ();}else {msgStateCallback.fail();}}}interface MsgStateCallback{void succ();void fail();}public static void main(String[] args) {MQ mq = new MQ();Producer producer = mq.new Producer();String msg = "my msg";producer.send(msg, new MsgStateCallback() {@Overridepublic void succ() {System.out.println("消息发送成功");}@Overridepublic void fail() {System.out.println("消息发送失败");}});}
}
2.直接调用
将参数改成Callback示例
package callback;public class DirectCallback {class Request{public void send(InvokeCallback.CallBack callBack) throws Exception {// 模拟等待响应Thread.sleep(3000);System.out.println("[Request]:收到响应");callBack.processResponse();}}public static void main(String[] args) throws InterruptedException {DirectCallback directCallback = new DirectCallback();final Request request = directCallback.new Request();System.out.println("发送请求");new Thread(new Runnable() {@Overridepublic void run() {try {request.send(new InvokeCallback.CallBack());} catch (Exception e) {e.printStackTrace();}}}).start();System.out.println("请求已经发送");Thread.sleep(10 * 1000);}}
3.接口调用
Callback作为接口传入参数
Java代码示例中就是接口调用方式!!!
package callback;import java.lang.reflect.Method;public class InterfaceCallback {class Request{public void send(ResponseCallback responseCallback) throws Exception {Thread.sleep(3000);responseCallback.processResponse();}}interface ResponseCallback{void processResponse();}public static void main(String[] args) throws InterruptedException {InterfaceCallback interfaceCallback = new InterfaceCallback();final Request request = interfaceCallback.new Request();System.out.println("发送请求");new Thread(new Runnable() {@Overridepublic void run() {try {request.send(new ResponseCallback() {@Overridepublic void processResponse() {System.out.println("收到响应");}});} catch (Exception e) {e.printStackTrace();}}}).start();System.out.println("请求已发送");Thread.sleep(10000);}}
4.Lambda表达式
package callback;import java.lang.reflect.Method;public class LambdaCallback {class Request{public void send(ResponseCallback responseCallback) throws Exception {Thread.sleep(3000);responseCallback.processResponse();}}interface ResponseCallback{void processResponse();}public static void main(String[] args) throws Exception {LambdaCallback lambdaCallback = new LambdaCallback();Request request = lambdaCallback.new Request();System.out.println("发送请求");new Thread(() -> {try {request.send(() -> System.out.println("处理响应"));} catch (Exception e) {e.printStackTrace();}} ).start();System.out.println("请求已发送");}}
参考博客:
https://juejin.im/post/6844904066129084429
http://gaocegege.com/Blog/java/java-callback