原創(chuàng)|其它|編輯:郝浩|2009-03-06 14:39:08.000|閱讀 469 次
概述:一個(gè)耗時(shí)響應(yīng)過程應(yīng)該采用回調(diào)和線程來處理,具體就是把原來的順序執(zhí)行修改為異步方式,并讓被調(diào)用者調(diào)用調(diào)用者以獲得執(zhí)行結(jié)果。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
現(xiàn)在程序中有許多涉及長耗時(shí)響應(yīng)過程的處理,比如訪問WebService,遠(yuǎn)程調(diào)用,復(fù)雜處理等,如果我們使用直接順序執(zhí)行的方式進(jìn)行處理有可能導(dǎo)致界面停頓,響應(yīng)停止,無謂等待等缺陷,這是不應(yīng)該的。
一個(gè)耗時(shí)響應(yīng)過程應(yīng)該采用回調(diào)和線程來處理,具體就是把原來的順序執(zhí)行修改為異步方式,并讓被調(diào)用者調(diào)用調(diào)用者以獲得執(zhí)行結(jié)果。在附件的例子 中,Viewer就是調(diào)用者,它代表界面,而LongTimeResponse是被調(diào)用者,它內(nèi)部用線程啟動(dòng)一個(gè)耗時(shí)過程,執(zhí)行完畢再通知調(diào)用者。
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類代碼如下,可以看出,它之所以能回調(diào)調(diào)用者,是因?yàn)槠鋬?nèi)部有調(diào)用者的引用viewer,在其構(gòu)造函數(shù)中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);
}
}
調(diào)用過程如下:
Viewer viewer=new Viewer(10);
LongTimeResponse longTimeResponse=new LongTimeResponse(viewer);
viewer.printNewCount(123);
執(zhí)行起來可以看出,程序先輸出了
New Count=123
過了十秒,才輸出:
New Count=1000
這說明,程序是異步執(zhí)行的,耗時(shí)過程沒有影響到主干程序的運(yùn)行,而耗時(shí)過程完成后,才把返回結(jié)果通知了調(diào)用者,主干程序沒有受到耗時(shí)過程的影響,因此也就不會(huì)導(dǎo)致界面停頓,響應(yīng)停止,無謂等待等缺陷。
以上就是使用回調(diào)和線程處理一個(gè)耗時(shí)響應(yīng)的整個(gè)過程。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn