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("hello,This 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");
}
}
運行結果:
由上面例子可以看出回調機制的好處,即可以在一個線程中影響另一個線程的運行。