現在程序中有許多涉及長耗時響應過程的處理,比如訪問WebService,遠程調用,復雜處理等,如果我們使用直接順序執行的方式進行處理有可能導致界面停頓,響應停止,無謂等待等缺陷,這是不應該的。
一個耗時響應過程應該采用回調和線程來處理,具體就是把原來的順序執行修改為異步方式,並讓被調用者調用調用者以獲得執行結果。在附件的例子中,Viewer就是調用者,它代表界面,而LongTimeResponse是被調用者,它內部用線程啟動一個耗時過程,執行完畢再通知調用者。
Viewer類代碼如下:
public class Viewer{
private int count;
public Viewer(int count){
this.count=count;
}
public void printNewCount(int newCount){
System.out.println("New Count="+newCount);
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
LongTimeResponse類代碼如下,可以看出,它之所以能回調調用者,是因為其內部有調用者的引用viewer,在其構造函數中viewer被賦上了值:
package com.sitinspring;
public class LongTimeResponse implements Runnable{
private Viewer viewer;
private int count;
public LongTimeResponse(Viewer viewer){
this.viewer=viewer;
this.count=viewer.getCount();
caculateNewCount();
}
private void caculateNewCount(){
Thread thread=new Thread(this);
thread.start();
}
public void run(){
try{
Thread.sleep(10000);
}
catch(Exception ex){
ex.printStackTrace();
}
viewer.printNewCount(count*count*count);
}
}
調用過程如下:
Viewer viewer=new Viewer(10);
LongTimeResponse longTimeResponse=new LongTimeResponse(viewer);
viewer.printNewCount(123);
執行起來可以看出,程序先輸出了
New Count=123
過了十秒,才輸出:
New Count=1000
這說明,程序是異步執行的,耗時過程沒有影響到主干程序的運行,而耗時過程完成後,才把返回結果通知了調用者,主干程序沒有受到耗時過程的影響,因此也就不會導致界面停頓,響應停止,無謂等待等缺陷。
以上就是使用回調和線程處理一個耗時響應的整個過程。