Java 回调 (Callback) 接口学习使用


推荐看我的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() {
            @Override
            public void succ() {
                System.out.println("消息发送成功");
            }

            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public void run() {
                try {
                    request.send(new ResponseCallback() {
                        @Override
                        public 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值