春天里,百花香...
現在程序中有許多涉及長耗時響應過程的處理,比如訪問WebService,遠程調用,復雜處理等,如果我們使用直接順序執行的方式進行處理有可能導致界面停頓,響應停止,無謂等待等缺陷,這是不應該的。 一個耗時響應過程應該采用回調和線程來處理,具體就是把原來的順序執行修改為異步方式,并讓被調用者調用調用者以獲得執行結果。在附件的例子中,Viewer就是調用者,它代表界面,而LongTimeResponse是被調用者,它內部用線程啟動一個耗時過程,執行完畢再通知調用者。 Viewer類代碼如下:
LongTimeResponse類代碼如下,可以看出,它之所以能回調調用者,是因為其內部有調用者的引用viewer,在其構造函數中viewer被賦上了值:
調用過程如下:
執行起來可以看出,程序先輸出了 New Count=123 過了十秒,才輸出: New Count=1000 這說明,程序是異步執行的,耗時過程沒有影響到主干程序的運行,而耗時過程完成后,才把返回結果通知了調用者,主干程序沒有受到耗時過程的影響,因此也就不會導致界面停頓,響應停止,無謂等待等缺陷。 以上就是使用回調和線程處理一個耗時響應的整個過程。 這里可下載整個程序: http://www.tkk7.com/Files/sitinspring/Callback20070628133516.zip 例程2: http://www.tkk7.com/Files/sitinspring/MVCThreadCallback.rar
posted on 2007-06-28 13:49 sitinspring 閱讀(2679) 評論(6) 編輯 收藏 所屬分類: 線程Thread
講得簡單明了,是篇好文章。 回復 更多評論
這種東西都應該用FutureTask來做了。。 回復 更多評論
謝謝樓上指教. 回復 更多評論
在1.5以上的版本當然可以使用 future task 個人還沒有發現 new thread 和 future task 的在應用時的主要區別 回復 更多評論
順便說一句 一般的情況下程序性能的瓶頸并不是future task 和 new thread 的區別 更加應該把注意力放在其它耗時的代碼上面 ex 業務操作 數據結構的重組...... 回復 更多評論
頂 回復 更多評論
Powered by: BlogJava Copyright © sitinspring