1. 程式人生 > 其它 >Java 回撥的理解和實現

Java 回撥的理解和實現

技術標籤:java基礎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();
     }
}

非同步回撥執行截圖