public class Store {
@Getter
@Setter
private String name;
Store(String name) {
this.name = name;
}
/回调函数, 将结构传给那个我们不能直接调用的方法, 然后获取结果/
public String returnOrderGoodsInfo(OrderResult order) {
String[] s = {“订购中…”, “订购失败”, “即将发货!”, “运输途中…”, “已在投递”};
Random random = new Random();
int temp = random.nextInt(5);
String s1 = s[temp];
return order.getOrderResult(s1);
}
}
SyncBuyer类, 同步顾客类, 其中获取商品的订购状态,orderGoods(), 调用了store返回商品调用信息的returnOrderGoodsInfo()方法, 但是在Store类的returnOrderGoodsInfo()方法之中, 以OrderResult接口为参数, 反过来调用了OrderResult接口, 相当于调用了其子类SyncBuyer本身, 以它为参数, 调用了getOrderResult(String state)方法, 也就是OrderResult接口的方法, 相当于就完成了一个调用的循环, 然后取到了我们自己无法给出的结果.
这个地方的"循环", 是回调的关键所在, 需要正常调用其他外接提供方法来获取结果的一方, 集成一个回调接口, 实现它, 然后调用第三方的API方法, 第三方在我们调用的方法之中, 以回调结构为参数, 然后调用了接口中的方法, 其中可以返回相应的结果给我们.
需要说明的是, 我们虽然实现了这个接口的方法, 但是我们自己的类之中, 或者说此类本身, 却没法调用这个方法, 也可以说, 此类调用这个方法是不会产生有效的结果的. 回调的回, 就体现在此处, 在Store类之中的returnOrderGoodsInfo(OrderResult order)方法之中, 得到了很好的体现.
/同步, 顾客在商店预订商品, 商店通知顾客预订情况/
public class SyncBuyer implements OrderResult {
@Getter
@Setter
private Store store;//商店
@Getter
@Setter
private String buyerName;//购物者名
@Getter
@Setter
private String goodsName;//所购商品名
SyncBuyer(Store store, String buyerName, String goodsName) {
this.store = store;
this.buyerName = buyerName;
this.goodsName = goodsName;
}
/调用从商店返回订购物品的信息/
public String orderGoods() {
String goodsState = store.returnOrderGoodsInfo(this);
System.out.println(goodsState);
myFeeling();// 测试同步还是异步, 同步需要等待, 异步无需等待
return goodsState;
}
public void myFeeling() {
String[] s = {“有点小激动”, “很期待!”, “希望是个好货!”};
Random random = new Random();
int temp = random.nextInt(3);
System.out.println(“我是” + this.getBuyerName() + ", 我现在的感觉: " + s[temp]);
}
/被回调的方法, 我们自己不去调用, 这个方法给出的结果, 是其他接口或者程序给我们的, 我们自己无法产生/
@Override
public String getOrderResult(String state) {
return “在” + this.getStore().getName() + “商店订购的” + this.getGoodsName() + "玩具, 目前的预订状态是: " + state;
}
}
Test2Callback类, 测试同步回
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
调的结果,
public class Test2Callback {
public static void main(String[] args) {
Store wallMart = new Store(“沙中路沃尔玛”);
SyncBuyer syncBuyer = new SyncBuyer(wallMart, “小明”, “超能铁扇公主”);
System.out.println(syncBuyer.orderGoods());
}
}
异步回调
====
同步回调和异步回调的代码层面的差别就是是否在我们调用第三方的API处, 为其开辟一条新的线程, 其他并无差异。Java知音公众号内回复”面试题聚合“,送你一份面试题宝典
例子
==
OrderResult接口, 其中的方法getOrderResult
public interface OrderResult {
//参数可以不用, 用不用按照自己的实际需求决定
public String getOrderResult(String state);
}
Store类, 商店提供会无预定消息返回的接口, 回调OrderResult接口的方法, 给其返回预订商品的状态.
public class Store {
@Getter
@Setter
private String name;
Store(String name) {
this.name = name;
}
/回调函数, 将结构传给那个我们不能直接调用的方法, 然后获取结果/
public String returnOrderGoodsInfo(OrderResult order) {
String[] s = {“订购中…”, “订购失败”, “即将发货!”, “运输途中…”, “已在投递”};
Random random = new Random();
int temp = random.nextInt(5);
String s1 = s[temp];
return order.getOrderResult(s1);
}
}
NoSyncBuyer类, 异步调用Store类的returnOrderGoodsInfo(OrderResult order)方法, 来返回商品转改的结果.
/异步/
@Slf4j
public class NoSyncBuyer implements OrderResult {
@Getter
@Setter
private Store store;//商店
@Getter
@Setter
private String buyerName;//购物者名
@Getter
@Setter
private String goodsName;//所购商品名
NoSyncBuyer(Store store, String buyerName, String goodsName) {
this.store = store;
this.buyerName = buyerName;
this.goodsName = goodsName;
}
/调用从商店返回订购物品的信息/
public String orderGoods() {
String goodsState = “–”;
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
System.out.println(goodsState);
goodsState = mr.getResult();// 得到返回值
myFeeling();// 用来测试异步是不是还是按顺序的执行
return goodsState;
}
public void myFeeling() {
String[] s = {“有点小激动”, “很期待!”, “希望是个好货!”};
Random random = new Random();
int temp = random.nextInt(3);
System.out.println(“我是” + this.getBuyerName() + ", 我现在的感觉: " + s[temp]);
}
/被回调的方法, 我们自己不去调用, 这个方法给出的结果, 是其他接口或者程序给我们的, 我们自己无法产生/
@Override
public String getOrderResult(String state) {
return “在” + this.getStore().getName() + “商店订购的” + this.getGoodsName() + "玩具, 目前的预订状态是: " + state;
}
// 开启另一个线程, 但是没有返回值, 怎么回事
// 调试的时候, 等待一会儿, 还是可以取到值, 但不是立即取到, 在print显示的时候, 却是null, 需要注意?
private class MyRunnable implements Runnable {
@Getter
@Setter
private String result;
@Override
public void run() {
try {
Thread.sleep(10000);
result = store.returnOrderGoodsInfo(NoSyncBuyer.this);// 匿名函数的时候, 无法return 返回值
} catch (InterruptedException e) {
log.error(“出大事了, 异步回调有问题了”, e);
}
}
}
}
Test2Callback类, 测试同步回调和异步回调的结果.
public class Test2Callback {



