前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

回调

作者头像
晚上没宵夜
发布2020-03-10 10:51:41
2.5K0
发布2020-03-10 10:51:41
举报

1. 回调

回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简单分析可以知道一个类(A)持有另一个类(B)的引用,方法(c)就叫做回调函数,画成UML图就如下所示:

2. 同步回调

这里模拟一个情景,小狗邀请小猫出去玩,而小猫要午睡,所以小狗要等到小猫睡醒了才一起出去玩,要实现的功能是小猫睡醒了回调通知小狗

其主要对象有:

  • 回调接口
  • 回调实现类
  • 被调用者

2.1 回调接口

代码语言:javascript
复制
public interface Callback {
    
    // 回调函数
    public void callback();

}

2.2 回调实现类

代码语言:javascript
复制
public class Dog implements Callback {
    
    // 持有类B的引用
    private Cat cat;
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    
    public void playOutside(){
        System.out.println("Dog:invite cat to play outside,but cat is sleep");
        cat.sleep(this);    // 重点在此,方法参数为回调类
    }
    
    @Override
    public void callback() {
        System.out.println("Dog:Let's go");
    }
    
}

2.3 被调用者

代码语言:javascript
复制
public class Cat {
    
    public void sleep(Callback callback){
        System.out.println("Cat:i need to sleep");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am waking up");
        callback.callback();  // 在此回调
    }
}

2.4 测试

代码语言:javascript
复制
public class test {
    
    public static void main(String[] args) {
        
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        // 设置引用
        dog.setCat(cat);
        
        // 邀请小猫出去玩
        dog.playOutside();
    }
}
代码语言:javascript
复制
Dog:invite cat to play outside
Cat:i need to sleep
Cat:i am sleeping
Cat:i am sleeping
Cat:i am waking up
Dog:Let's go

3. 异步回调

回调最重要体现在异步上,在上面的例子中,小狗在等小猫醒来的过程中是被阻塞不能执行其他任务的,所以异步回中小狗在等小猫过程中可以干其他事情,等小猫醒了再去执行出去玩这个任务,提高了执行效率

3.1 改造Dog类

代码语言:javascript
复制
public class Dog implements Callback {
    
    private Cat cat;
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    
    public void playOutside(){
        System.out.println("Dog:invite cat to play outside");
        new Thread( () -> {
                try {
                    cat.sleep(this);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }).start();
    }
    
    public void watchTV(){
        System.out.println("Dog:i am watching TV");
    }
    
    public void playGame(){
        System.out.println("Dog:i am playing Game");
    }
    
    @Override
    public void callback() {
        System.out.println("Dog:Let's go");
    }
}

3.2 改造Cat类

代码语言:javascript
复制
public class Cat {
    
    public void sleep(Callback callback) throws InterruptedException{
        System.out.println("Cat:i need to sleep");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am sleeping");
        Thread.sleep(5000);     // 猫说完就睡了5秒
        System.out.println("Cat:i am waking up");
        callback.callback();    // 猫醒来就告诉狗
    }
}

3.3 异步回调测试

代码语言:javascript
复制
public class test {
    
    public static void main(String[] args) throws InterruptedException {
        
        Dog dog = new Dog();
        Cat cat = new Cat();
        dog.setCat(cat);
        
        // 小狗邀请小猫
        dog.playOutside();
        
        // 这里睡1秒为了让小狗邀请小猫这个动作执行完
        Thread.sleep(1000);
        
        // 小猫午睡期间小狗执行了其他任务
        dog.watchTV();
        dog.playGame();
        
    }
}
代码语言:javascript
复制
Dog:invite cat to play outside
Cat:i need to sleep
Cat:i am sleeping
Cat:i am sleeping
Dog:i am watching TV
Dog:i am playing Game
Cat:i am waking up
Dog:Let's go
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 同步回调
    • 2.1 回调接口
      • 2.2 回调实现类
        • 2.3 被调用者
          • 2.4 测试
          • 3. 异步回调
            • 3.1 改造Dog类
              • 3.2 改造Cat类
                • 3.3 异步回调测试
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档