「其他」Java 异步回调机制

同步、回调、异步三种调用方式

1、同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;

2、回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;具体说来:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。

3、异步调用,即通过异步消息进行通知。多线程是异步处理,异步就意味着不知道处理结果。

异步回调的使用

1、定义回调接口

public interface CallBack {
    void solve(String result);
}

2、主调程序

public class CallbackRequest implements CallBack {

    private CallbackResponse callbackResponse;

    public CallbackRequest(CallbackResponse callbackResponse) {
        this.callbackResponse = callbackResponse;
    }

    //主调需要解决一个问题,所以他把问题交给被调处理,被调单独创建一个线程,不影响主调程序的运行
    public void request(final String question) {
        System.out.println("主调程序问了一个问题");
        new Thread(() -> {
            //【A中持有B的引用,调用B的方法】B想要帮A处理东西,就必须知道谁让自己处理的,所以要传入a,也要知道a想处理什么,所以要传入question
            callbackResponse.handler(this, question);
        }).start();
        //A把要处理的事情交给b之后,就可以自己去玩耍了,或者去处理其他事情
        afterAsk();
    }

    private void afterAsk() {
        System.out.println("主调程序继续处理其他事情");
    }

    //回调接口,会被调用
    @Override
    public void solve(String result) {
        System.out.println("被调程序接到答案后进行处理" + result);
    }
}

3、被调程序

public class CallbackResponse {

    public void handler(CallBack callback, String request) {
        System.out.println(callback.getClass() + "问的问题是:" + request);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String result = "\n答案是2";
        //【B中通过方法参数或的A的引用,调用A的方法】
        callback.solve(result);
    }
}

4、测试

public class CallbackTest {
    public static void main(String[] args) {
        CallbackResponse callbackResponse = new CallbackResponse();
        CallbackRequest callbackRequest = new CallbackRequest(callbackResponse);
        callbackRequest.request("1+1");
    }
}

 

posted @ 2022-06-24 16:01  残城碎梦  阅读(657)  评论(0编辑  收藏  举报