春風(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)在程序中有許多涉及長(zhǎng)耗時(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 閱讀(2688) 評(píng)論(6)  編輯  收藏 所屬分類: 線程Thread

          評(píng)論

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

          講得簡(jiǎn)單明了,是篇好文章。  回復(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)論   


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


          網(wǎng)站導(dǎo)航:
           
          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 宁晋县| 梅河口市| 岑巩县| 苗栗市| 策勒县| 科尔| 弥渡县| 木兰县| 苍梧县| 介休市| 和林格尔县| 公安县| 平武县| 丹寨县| 郸城县| 卢氏县| 汤原县| 西乌珠穆沁旗| 镇康县| 广饶县| 苏尼特左旗| 芜湖市| 分宜县| 永登县| 监利县| 巨鹿县| 蒙山县| 永清县| 广东省| 黎城县| 英德市| 沁水县| 黎川县| 稻城县| 卢龙县| 凤台县| 梅州市| 开远市| 玛多县| 平陆县| 海淀区|