春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

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

          統(tǒng)計(jì)

          公告

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

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          使用回調(diào)和線程處理一個(gè)耗時(shí)響應(yīng)過程

          現(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è)過程。

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

          評(píng)論

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

          講得簡單明了,是篇好文章。  回復(fù)  更多評(píng)論   

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

          這種東西都應(yīng)該用FutureTask來做了。。  回復(fù)  更多評(píng)論   

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

          謝謝樓上指教.  回復(fù)  更多評(píng)論   

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

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

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

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

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

          頂  回復(fù)  更多評(píng)論   


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


          網(wǎng)站導(dǎo)航:
           
          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 长泰县| 东乡县| 屯留县| 保靖县| 静乐县| 华安县| 正阳县| 柳州市| 玛纳斯县| 绥滨县| 望城县| 商河县| 扎鲁特旗| 谷城县| 伊春市| 乐东| 梁河县| 新安县| 泰安市| 天气| 红桥区| 精河县| 东平县| 安多县| 枝江市| 清原| 杭州市| 城固县| 兴隆县| 驻马店市| 乌海市| 鄂州市| 惠来县| 保定市| 乌拉特中旗| 汝州市| 肥城市| 兴化市| 昌黎县| 舟曲县| 华阴市|