版权声明:转载请注明出处 https://blog.csdn.net/h2604396739/article/details/84720639
生活场景如下:
Wang写数学题,有一道比较难,需要问Li,Li也不会,要先回家一趟问问老爸怎么做,这个时候有wang如下三种选择:
1)一直等待Li回来,期间啥也不干同步方式
2) 等等再过来看Li回来没,异步future方式
3)wang把电话留下来,让LI回来时打电话给自己。异步callback方式
其中联系方式 就是回调函数,也就是其他人在完成任务后会调用的函数
而留下联系方式的过程称为登记回调函数,也就是要其他人帮自己去做某件事.
先介绍什么是回调:
就是A类中调用B类中的某个方法C,然后B类在方法c中反过来调用A类中的方法D,D这个方法就叫回调方法。
Class A实现接口CallBack——要求1
class A中包含一个class B的引用b ——要求2
class B有一个包含参数CallBack的方法c(CallBack callback) ——要求3
A的对象a调用B的方法 c(CallBack callback) ——A类调用B类的某个方法 C,同时将a作为参数传给方法c
然后b就可以在c(CallBack callback)方法中调用A的方法d ——B类调用A类的某个方法D
回调接口:
public interface CallBack {
void solveProblem(String question,String answer);
}
wang-->类A
public class Wang implements CallBack{
Li li;
public Wang(Li li){
this.li=li;
}
// 主线程不关心异步执行的结果
public void askQuestion(String question) {
System.out.println("wnag:li,"+question);
// Runnable异步方式,不等待,不关心返回值
new Thread(new Runnable() {
@Override
public void run() {
// 注意,这里吧wang.this也传了过去
li.solveAnswer(question,Wang.this);
}
}).start();
System.out.println("wang:我逛街了");
}
// 主线程关心异步执行的结果
public void askQuestion2(String question) throws ExecutionException, InterruptedException {
System.out.println("wnag:li,"+question);
// Callable异步方式,不等待
ExecutorService executorService = Executors.newFixedThreadPool(2);
FutureTask futureTask = new FutureTask(new Callable() {
@Override
public Object call() {
li.solveAnswer(question, Wang.this);
return null;
}
});
Future<?> future = executorService.submit(futureTask);
System.out.println("wang:我逛街了");
// 对异步回调返回的结果继续处理
Object o1 = future.get();
System.out.println("wang:根据异步结果继续干活");
}
@Override
public void solveProblem(String question,String answer) {
System.out.println("wang:"+question+"答案是:"+answer);
}
}
对wang需要说明的是,askQuestion和askQuestion2两种实现方式的区别,虽然都是异步的,但是主线程对异步执行的结果处理不同,askQuestion2中可以获取对应返回类并进行处理。
Li--->类B
public class Li {
public void solveAnswer(String question, CallBack callBack){
// 为了展示异步效果,所以故意进行延迟
for(int i=0;i<10000000;i++){
}
System.out.println("li: do myself thing");
String answer = "";
if("1+1=".equals(question)){
answer="2";
}else{
answer="no answer";
}
System.out.println("li: get answer"+answer);
callBack.solveProblem(question,answer);
}
}
调用代码:
public static void main(String[] args) throws ExecutionException, InterruptedException {
Li li = new Li();
Wang wang = new Wang(li);
// wang.askQuestion("1+1=");
wang.askQuestion2("1+1=");
}
参考文章: