Java回調機制解析

Java回調機制解析

         回調機制的概念可用一句話總結:A對象調用B對象的C方法時,C方法內可調用A對象中的D方法,這個過程就是所謂的回調機制。

         示例代碼:

A方法

public class A {

         public voidD(){

                   System.out.println("調用A對象的D方法");

         }

         public static void main(String[] args){

                   B b= new B();

                   A a= new A();

                   b.C(a);

         }

}

B方法

public class B {

         public voidC(A a){

                   System.out.println("調用B對象的C方法");

                   a.D();

         }

}

運行:

這樣說來回調機制其實也不是什麼高級的東西,因爲B對象的C方法還是需要A類型的參數的,然後再調用該A類型參數的D方法,不是什麼未知的內容。但是這種思路在多線程的時候起了很大的作用,比方說這麼一個情景:

A打電話給B,但是B一時在忙,沒辦法接電話,在B沒有接電話的這段時間,電話不停地在響鈴(這是一個A開啓的線程),當B接起電話時,電話纔會停止響動(即B關閉A開啓的線程),但是隻有A中的辦法才能關閉A的電話響鈴,所以B必須調用A的方法才能關閉電話,程序如下:

PhoneBegin類

package example01;

 

/**

 * @author Blank

 *

 */

public class PhoneBegin implementsCallback,Runnable{

         privateint status= 1;

         publicstatic voidmain(String[] args){

                   PhoneBegin begin = new PhoneBegin();

                   //A開始打電話

                   begin.givePhone();

                   Remote remote = new Remote();

                   //B過了10秒才接起電話

                   try{

                            Thread.sleep(10000);

                   } catch(InterruptedException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                   }

                   remote.PickUpPhone(begin);

         }

         publicvoid givePhone(){

                   //開始打電話,電話開始響鈴,這是一個新的線程

                   System.out.println("開始打電話");

                   Thread thread = new Thread(this);

                   thread.start();

                  

                  

                  

         }

        

         /*A類中關閉響鈴的方法*/

         publicvoid execute(String name){

                   System.out.println("helloThis is "+name);

                   this.status=0;

         }

         publicvoid run(){

                   //電話每隔1秒響鈴一次,並且在執行A類的execute方法之前是無法停止響鈴的

                   while(true){

                            try {

                                     Thread.sleep(1000);

                            } catch (InterruptedException e) {

                                     // TODO Auto-generated catch block

                                     e.printStackTrace();

                            }

                           

                            if(this.status==0){

                                     break;

                            }else{

                                     System.out.println("鈴鈴鈴");

                            }

                   }

                  

                  

         }

        

}

CallBack接口

package example01;

 

public interface Callback {

         publicvoid execute(String name);

}

Remote類

package example01;

 

/**

 * @author Blank

 *

 */

public class Remote {

         publicvoid PickUpPhone(Callback call){

                  

                   //回調A關閉鈴聲的方法

                   call.execute("Bob");

         }

}

 

運行結果:


由上面例子可以看出回調機制的好處,即可以在一個線程中影響另一個線程的運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章