十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
创新互联主打移动网站、网站制作、网站建设、网站改版、网络推广、网站维护、域名注册、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
首先说点题外话。为什么要写这篇文章,因为在看J.U.C包的FutureTask源码的时候,有一个done()方法,这是个抽象方法,用户实现它之后,FutureTask会在执行完后调用这个方法。这就是回调机制,回调的思想就是:
类A调用类B的b方法
给出思想过于抽象,所以我会举出一个简单的实例(虽然简单,但是能说明问题),并总结Java实现回调的步骤。
实例基于知乎上一个解释什么是回调机制的回答。
描述: 一个顾客入住了一个酒店,酒店提供叫醒服务,顾客由于第二天早晨有很重要的事情,所以使用了叫醒服务。让酒店工作人员在第二天早晨7:00叫醒顾客。
在这个例子中,顾客是A类,酒店是B类,顾客预订叫醒服务相当于A调用了B的b方法,酒店叫醒顾客相当于B调用了A的callback方法(被叫醒)。
下面给出代码:
1、首先是回调接口:
package callback;
//回调接口
public interface CallBack {
public void beWakedUp();
}
2、接着是顾客类
顾客类实现回调接口
package callback;
public class Customer implements CallBack {
//顾客同时持有酒店类的对象,后面定义
private Hotel hotel;
public Customer(Hotel hotel) {
this.hotel = hotel;
}
@Override
public void beWakedUp() {
System.out.println("被叫醒了");
}
// 客户预约使用酒店的叫醒功能
public void bookWakeService() {
hotel.wakeService(this);
}
// 省略get set
}
3、酒店类
package callback;
public class Hotel {
public void wakeService(CallBack callBack) {
System.out.println("顾客预约了叫醒服务");
try {
// 模拟时间过了一晚上
Thread.sleep(3000);
System.out.println("时间过去了一夜");
callBack.beWakedUp();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4、测试主类
package callback;
public class Main {
public static void main(String[] args) {
Hotel hotel = new Hotel();
Customer customer = new Customer(hotel);
customer.bookWakeService();
}
}
输出结果为:
不知道你对回调机制有没有进一步理解呢?
最后总结一下Java中实现回调机制的大体步骤吧:
定义回调接口CallBack
类A实现回调接口CallBack
,同时持有类B的对象b
类B中有方法method(CallBack cb)
由于A中持有B的对象,所以A可以调用B的method方法,并将自身作为参数传入method(因为A实现了CallBack接口,所以可以传入)。