Java 回调的理解和实现

Java 回调

回调分类

回调大体上分为两种:同步回调、异步回调;两者基本相似。

首先解释回调,在此基础上就容易理解同步和异步的区别。

回调:

  • 教师(对象1) 调用 布置作业(方法) 发布给 学生(对象2)
  • 学生(对象2) 完成 作业(方法) 后,跑到 教师办公室(回调接口),交作业,并调用 完成作业(对象1的回调接口方法)

同步回调:在教师布置作业后等待学生完成作业,等待的时间内,不做任何事情
异步回调:在教师布置作业后(通过新线程布置),去做其他事情

提问:

  • 学生(对象2)如何调用教师(对象1)的完成作业方法
    • 实质上,学生 调用的是 回调接口 的方法(并不局限于某个固定的教师对象)
  • 学生 怎样获取 该回调接口
    • 其实很简单,在 教师 布置作业时,告知 学生,要去哪里交作业,即将 回调接口 传入 学生对象
    • 在此前提上理解,教师 必须要完成 回调接口

注:以下为 异步回调 的代码

public class Teacher{
     private String name;
     public Teacher(String name) {
           this.setName(name);
     }
     public String getName() {
           return name;
     }
     public void setName(String name) {
           this.name = name;
     }
     
     /*
      * 1、教师布置任务给学生
      * 2、告知学生在哪个办公室交作业
      */
     public void setWork(WorkRoom workRoom, Student student) {
           //学生开始完成任务
           System.out.println(this.name + "布置作业给" + student.getName());
           student.doWork(this, workRoom);
     }
     
     public void drinkTea() {
           System.out.println("开始喝茶.....");
     }
}
public class Student {
     private String name;
     public Student(String name) {
           this.name = name;
     }
     
     public void doWork(Teacher teacher, WorkResult workResult) 
     {
           System.out.println(this.name + "正在完成作业......");
           System.out.println(this.name + "已经完成作业!");
           //完成任务之后,交作业
           //回调接口
           workResult.getWorkResult(teacher.getName(), this.name);
     }

     public String getName() {
           return name;
     }
     public void setName(String name) {
           this.name = name;
     }
}
//回调接口:学生通过该接口向老师报告
public interface WorkResult {
     public void getWorkResult(String teacher_name, String student_name);
}
//办公室
public class WorkRoom implements WorkResult{
     private String name;
     public WorkRoom(String name) {
           this.name = name;
     }
     
     //办公室收到作业
     @Override
     public void getWorkResult(String teacher_name, String student_name) {
           System.out.println("在" + this.name + "中," +student_name + "已经上交" + teacher_name + "的作业");
     }

}
public class RunTest {
     public static void main(String[] args) {
           Teacher teacher = new Teacher("张三");
           Student student = new Student("阿四");

           WorkRoom workRoom = new WorkRoom("一年级办公室");
           
           //新建线程
           new Thread(
                new Runnable() {
                     public void run() {
                           try {
                                Thread.sleep(100);
                                //若想改为 同步回调,只需将该行代码挪出,删去新建线程即可
                                teacher.setWork(workRoom, student);
                           } catch (InterruptedException e) {
                                e.printStackTrace();
                           }
                     }
                }
           ).start();
           
           teacher.drinkTea();
     }
}

异步回调运行截图

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值