有類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來實現的多線程。
未完待續... ...