春風(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)過(guò)程

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

          一個(gè)耗時(shí)響應(yīng)過(guò)程應(yīng)該采用回調(diào)和線程來(lái)處理,具體就是把原來(lái)的順序執(zhí)行修改為異步方式,并讓被調(diào)用者調(diào)用調(diào)用者以獲得執(zhí)行結(jié)果。在附件的例子中,Viewer就是調(diào)用者,它代表界面,而LongTimeResponse是被調(diào)用者,它內(nèi)部用線程啟動(dòng)一個(gè)耗時(shí)過(guò)程,執(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)用過(guò)程如下:

                  Viewer viewer=new Viewer(10);
                  LongTimeResponse longTimeResponse
          =new LongTimeResponse(viewer);        
                  viewer.printNewCount(
          123);


          執(zhí)行起來(lái)可以看出,程序先輸出了
          New Count=123
          過(guò)了十秒,才輸出:
          New Count=1000

          這說(shuō)明,程序是異步執(zhí)行的,耗時(shí)過(guò)程沒(méi)有影響到主干程序的運(yùn)行,而耗時(shí)過(guò)程完成后,才把返回結(jié)果通知了調(diào)用者,主干程序沒(méi)有受到耗時(shí)過(guò)程的影響,因此也就不會(huì)導(dǎo)致界面停頓,響應(yīng)停止,無(wú)謂等待等缺陷。

          以上就是使用回調(diào)和線程處理一個(gè)耗時(shí)響應(yīng)的整個(gè)過(guò)程。

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

          評(píng)論

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

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

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

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

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

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

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

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

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

          順便說(shuō)一句
          一般的情況下程序性能的瓶頸并不是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)過(guò)程 2009-03-13 18:10 wangmogang

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


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


          網(wǎng)站導(dǎo)航:
           
          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 石柱| 洛川县| 沅江市| 手游| 定南县| 蒲城县| 正定县| 威宁| 普格县| 资溪县| 铜山县| 阜宁县| 弥渡县| 陆川县| 新民市| 吴堡县| 江源县| 靖边县| 南平市| 红原县| 临泉县| 湘潭市| 伊宁市| 牙克石市| 常宁市| 尼木县| 台中县| 瓦房店市| 西充县| 洱源县| 青海省| 阿合奇县| 临西县| 互助| 花莲市| 德阳市| 民权县| 林甸县| 昌吉市| 罗江县| 三河市|