Java 回撥的理解和實現
阿新 • • 發佈:2021-01-13
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();
}
}