春風博客

          春天里,百花香...

          導航

          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

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

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

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

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

          這里可下載整個程序:
          http://www.aygfsteel.com/Files/sitinspring/Callback20070628133516.zip

          例程2:
          http://www.aygfsteel.com/Files/sitinspring/MVCThreadCallback.rar

          posted on 2007-06-28 13:49 sitinspring 閱讀(2682) 評論(6)  編輯  收藏 所屬分類: 線程Thread

          評論

          # re: 使用回調和線程處理一個耗時響應過程 2007-06-29 10:59 我為J狂

          講得簡單明了,是篇好文章。  回復  更多評論   

          # re: 使用回調和線程處理一個耗時響應過程 2007-06-30 12:37 L

          這種東西都應該用FutureTask來做了。。  回復  更多評論   

          # re: 使用回調和線程處理一個耗時響應過程 2007-06-30 13:20 sitinspring

          謝謝樓上指教.  回復  更多評論   

          # re: 使用回調和線程處理一個耗時響應過程[未登錄] 2008-01-13 11:49

          在1.5以上的版本當然可以使用 future task
          個人還沒有發現 new thread 和 future task 的在應用時的主要區別  回復  更多評論   

          # re: 使用回調和線程處理一個耗時響應過程[未登錄] 2008-01-13 11:52

          順便說一句
          一般的情況下程序性能的瓶頸并不是future task 和 new thread 的區別
          更加應該把注意力放在其它耗時的代碼上面 ex 業務操作 數據結構的重組......  回復  更多評論   

          # re: 使用回調和線程處理一個耗時響應過程 2009-03-13 18:10 wangmogang

          頂  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 商水县| 佛山市| 仲巴县| 理塘县| 长海县| 武义县| 长沙县| 宜阳县| 吴堡县| 南乐县| 醴陵市| 余姚市| 酒泉市| 卢氏县| 五常市| 延川县| 醴陵市| 山丹县| 确山县| 西丰县| 囊谦县| 忻州市| 南澳县| 麟游县| 湘潭县| 定边县| 古交市| 浙江省| 邵阳县| 周口市| 大渡口区| 顺平县| 鸡西市| 巢湖市| 泰顺县| 辽阳县| 靖远县| 林周县| 雷州市| 泰宁县| 彭阳县|