程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> java使用回調和線程處理一個耗時響應全過程

java使用回調和線程處理一個耗時響應全過程

編輯:J2EE

現在程序中有許多涉及長耗時響應過程的處理,比如訪問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

這說明,程序是異步執行的,耗時過程沒有影響到主干程序的運行,而耗時過程完成後,才把返回結果通知了調用者,主干程序沒有受到耗時過程的影響,因此也就不會導致界面停頓,響應停止,無謂等待等缺陷。

以上就是使用回調和線程處理一個耗時響應的整個過程。


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved