<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風博客

    春天里,百花香...

    導航

    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統計

    公告

    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://m.tkk7.com/Files/sitinspring/Callback20070628133516.zip

    例程2:
    http://m.tkk7.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://m.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 在线观看亚洲AV日韩AV| 亚洲午夜国产精品无卡| 看全色黄大色大片免费久久| 亚洲视频免费一区| 特级毛片aaaa免费观看| 日韩免费三级电影| 精品韩国亚洲av无码不卡区| 亚洲国产精品国产自在在线| 亚洲一区二区三区免费| 亚洲AV综合色区无码另类小说| 男人j进入女人j内部免费网站| 亚洲日本中文字幕| 无码av免费毛片一区二区| 久久精品国产亚洲网站| 国产亚洲美女精品久久久久| 四虎亚洲国产成人久久精品| 亚洲精品亚洲人成在线播放| 美女视频黄的免费视频网页| 久久夜色精品国产噜噜亚洲AV| 美女巨胸喷奶水视频www免费| 亚洲αv久久久噜噜噜噜噜| 1000部拍拍拍18勿入免费视频软件 | 最近2019中文免费字幕在线观看 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产一卡二卡四卡免费| 国产AV无码专区亚洲AV毛网站| 日本人成在线视频免费播放| 亚洲午夜久久久久久尤物| 国产传媒在线观看视频免费观看 | 亚洲乱码无限2021芒果| 日本成人在线免费观看| 香蕉免费一级视频在线观看| 亚洲国色天香视频| 成人黄色免费网址| 亚洲成AV人片在WWW| 中文字幕亚洲不卡在线亚瑟| 国产激情久久久久影院老熟女免费| 亚洲成在人线av| 老司机永久免费网站在线观看| 大地资源中文在线观看免费版| 国产成人精品日本亚洲18图|