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();
}
}