春風博客

          春天里,百花香...

          導航

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

          統(tǒng)計

          公告

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

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          使用回調(diào)和線程處理一個耗時響應過程

          現(xiàn)在程序中有許多涉及長耗時響應過程的處理,比如訪問WebService,遠程調(diào)用,復雜處理等,如果我們使用直接順序執(zhí)行的方式進行處理有可能導致界面停頓,響應停止,無謂等待等缺陷,這是不應該的。

          一個耗時響應過程應該采用回調(diào)和線程來處理,具體就是把原來的順序執(zhí)行修改為異步方式,并讓被調(diào)用者調(diào)用調(diào)用者以獲得執(zhí)行結(jié)果。在附件的例子中,Viewer就是調(diào)用者,它代表界面,而LongTimeResponse是被調(diào)用者,它內(nèi)部用線程啟動一個耗時過程,執(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)用者,是因為其內(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í)行的,耗時過程沒有影響到主干程序的運行,而耗時過程完成后,才把返回結(jié)果通知了調(diào)用者,主干程序沒有受到耗時過程的影響,因此也就不會導致界面停頓,響應停止,無謂等待等缺陷。

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

          這里可下載整個程序:
          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 閱讀(2686) 評論(6)  編輯  收藏 所屬分類: 線程Thread

          評論

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

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

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

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

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

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

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

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

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

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

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

          頂  回復  更多評論   


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


          網(wǎng)站導航:
           
          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 邵阳县| 麻阳| 瓦房店市| 松溪县| 安丘市| 新河县| 洪湖市| 郸城县| 门头沟区| 孟津县| 容城县| 松江区| 琼结县| 齐齐哈尔市| 荔波县| 信阳市| 江川县| 昌江| 延安市| 新兴县| 治县。| 什邡市| 黄石市| 鄂尔多斯市| 屯昌县| 广昌县| 卢龙县| 定州市| 衡山县| 应城市| 孟村| 华蓥市| 虹口区| 安仁县| 南郑县| 黑龙江省| 望谟县| 磐石市| 汤阴县| 乐都县| 杭州市|