「其他」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");
}
}