Java回調與接口


有類A和類B,分別有a();和b();方法。其中a()中會調用b()方法

 1 public class A {  2  3 public void a() {  4 new B().b();
       a2(); 5 } 6 7 public void a2() { 8 System.out.println("a2 is running"); 9 } 10 }
public class B {

    public void b() {
        System.out.println("b is running");
    }
}

如果b()方法的執行時間較短的話,可以不用管其他,這樣調用就好。但是,如果執行時間較長的話,a()方法里往下的代碼無法繼續執行,會一直等待b()方法執行完事。這就是方法的同步調用。
缺點是,一個方法執行時間長或阻塞,會造成整個a()方法的流程阻塞。那么,為解決這個問題,就出現了方法的異步調。

異步調用

 類A的a()方法可以采用另起線程的方式來調用b()方法。

這中方式也會有種問題,如果b()的執行結果不影響a()方法中下面的執行,就這樣調用就好,但是,如過下面的代碼需要b()返回的結果,則必須通過什么途徑對b()方法執行結果進行監聽,java中可以通過Future+Callable的方式可以

實現這一點(實現方式稍后解釋)。

這里呢,我們可以簡單的給A類放一個callBack()函數,來當作回調函數。每次b()方法執行完就會主動調用A類的callBack()方法,這也是一種雙重調用。

 1 public class A {
 2 
 3     public void a() {
 4         new B().b(this);
 5     }
 6     
 7     public void a2() {
 8         System.out.println("a2 is running");
 9     }
10     
11     public void callBack() {
12         System.out.println("callback is running");
13     }
14 }
1 public class B { 2 3 public void b(A a) { 4 System.out.println("b is running"); 5 //通知A我執行完了 6  a.callBack(); 7  } 8 }

     但是以上場景適合於只有A來調用B的b()方法,而也是只通知了A。如果有跟A類一樣,都需要調用b()方法,且要實時等待b()的執行結果,怎么辦?

不可能也N個b(A a); b(C c);等等諸如此類的方法吧,

OK,針對這種需要多態的應用場景,我們的接口自然而然地就要上了,我們可以把回調這一行為抽象出來,讓所有要調用b()方法的類都去實現這個抽象。

場景:A,C,D都有一個方法需要B的b()方法,而且都需要的b()的返回結果干一些事情。

  那么我們就可以來抽象一下前面三個類的行為了。

 首先,我們把A,C, D中需要b的返回結果做其他事的方法都抽象到一個接口中,就叫它callBack。

 

1 public interface CallBackInterface {
2     public void callBack(int reInt);
3 }
 1 public class A implements CallBackInterface{
 2 
 3     public void a() {
 4         new B().b(this);
 5     }
 6     
 7     public void a2(int parm1) {
 8         System.out.println("A類方法中 b() 的返回結果是  :" + parm1); 
9
} 10 11 @Override 12 public void callBack(int reInt) { 13 14 a2(reInt); 15 } 16 }
1 public class B {
2 
3     public void b(CallBackInterface tmp) {
4         System.out.println("b is running");
5         int result = 10;
6         //通知A我執行完了
7         tmp.callBack(result);
8     }
9 }
 1 public class C implements CallBackInterface{
 2 
 3     public void c() {
 4         new B().b(this);
 5     }
 6     
 7     public void c2(int parm1) {
 8         System.out.println("C類方法中 b() 的返回結果是  :" + parm1);
 9     }
10     
11     @Override
12     public void callBack(int reInt) {
13         c2(reInt);
14     }
15 
16 }
 1 public class Main {  2  3 public static void main(String[] args) {  4  5 A tmA = new A();  6  7  tmA.a();  8  9 C tmC = new C(); 10 11  tmC.c(); 12  } 13 14 }

運行結果:

接下來再說明一下,java中用Future模式和Callable來實現的多線程。

 未完待續...  ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM