ThinkAndroid線程池機制

/**************************************************************************************************

 

 *  本博客為CSDN博主【MK】原創,博客地址:https://blog.csdn.net/mkrcpp/article/details/14166627

 

 **********************************************************************************************************************/

 

TAApplication是ThinkAndroid的靈魂,整個框架的初始化工作都在這裡進行瞭。

 

其中有一個重要的工作,即初始化線程池機制 ,英文名為TACommandExecutor。

 

之所以稱為機制,是因為這不僅僅是一個線程池。

 

通過觀察代碼可以看出,最最重要的代碼是

 

public void ensureInitialized()  

{  

    if (!initialized)  

    {  

        initialized = true;  

        TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  

        TACommandQueueManager.getInstance().initialize();  

        TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  

    }  

}  

 

其中涉及到一個很重要的類,即 TACommandQueueManager,看名字就知道這是一個隊列管理器 。

好,接下來我們就研究下TACommandQueueManager,

 

非常清晰的,我們看到連個重要的屬性,TAThreadPool,TACommandQueue,

 

看名字就知道一個是線程池,一個是指令隊列。然後 TACommandQueueManager的作用就是初始化線程池和初始化隊列。

 

通過研究線程池 TAThreadPool 的代碼可以知道,默認僅僅是創建瞭2個線程,並且在系統啟動時運行起來。

 

通過研究指令隊列TACommandQueue的代碼可以知道它維護瞭一個LinkedBlockingQueue,一個阻塞隊列,由鏈表實現。

 

阻塞隊列的好處就是:

 

當一個線程A申請從隊列中取數據時,如果隊列中沒有數據,那麼線程A就發生阻塞,直到隊列中存在數據。

同樣的,當線程B想向隊列中存放數據時,如果隊列已滿,那麼線程B阻塞,直到隊列中被取走瞭一個值,這就是咱們熟悉的生產者消費者模式嘛。

OK,說瞭這麼多,稍微整理下

 

————————————  

TACommandQueueManager   初始化瞭    一個阻塞隊列和一個線程池,線程池不斷的從隊列中取指令並執行  

TACommandExecutor       初始化瞭    TACommandQueueManager   

TAApplication           初始化瞭    TACommandExecutor  

————————————  

基本上搞清楚瞭,唯一不清楚的就是什麼是Command,阻塞隊列維護的是什麼樣的指令呢,線程池執行的到底是什麼呢?

 

我們來分析下

 

TAICommand:           

    -getRequest()獲得請求數據  

    -setRequest(TARequest request)設置請求數據  

    -getResponse()獲得返回數據  

    -setResponse(TAResponse response)設置趕回數據  

    -execute()  

    -getResponseListener()獲得響應/返回監聽器  

    -setResponseListener(TAIResponseListener listener)設置響應/返回監聽器  

    -setTerminated(boolean terminated)設置是否終結/停止  

    -isTerminated()判斷狀態是否停止  

—————————————————————————-  

  

        TABaseCommand:基礎指令  

            *getRequest()  

            *setRequest(TARequest request)  

            *getResponse()  

            *setResponse(TAResponse response)     

            *getResponseListener()  

            *setResponseListener(TAIResponseListener responseListener)  

            *setTerminated(boolean terminated)  

            *isTerminated()  

            TARequest: 請求提交的數據  

                Tag     標記  

                Data        數據  

                activityKeyResID  

                activityKey  

            TAResponse:返回的數據,結果  

                Tag     標記  

                Data        數據  

                activityKeyResID          

                activityKey  

            TAIResponseListener:    數據返回的一個監聽器  

                onStart()  

                onSuccess(TAResponse response)  

                onRuning(TAResponse response)  

                onFailure(TAResponse response)  

                onFinish()  

—————————————————————————-  

  

                TACommand:  

                    TAIResponseListener  

                    private Handler handler = new Handler()  

                    {  

                        public void handleMessage(Message msg)  

                        {  

                            switch (msg.what)  

                            {  

                            case command_start:  

                                listener.onStart();  

                                break;  

                            case command_runting:  

                                listener.onRuning(getResponse());  

                                break;  

                            case command_success:  

                                listener.onSuccess(getResponse());  

                                break;  

                            case command_failure:  

                                listener.onFailure(getResponse());  

                                break;  

                            case command_finish:  

                                listener.onFinish();  

                                break;  

                            default:  

                                break;  

                            }  

                        };  

  

                    };  

  

                    *public final void execute()  

                    {  

                        onPreExecuteCommand();  //listener.onStart();  

                        executeCommand();   //abstract  

                        onPostExecuteCommand(); //null  

                    }  

—————————————————————————-  

  

                            TestMVCCommand  異步下載,發送信息通知 hanlder處理數據  

                                *protected void executeCommand()  

                                 {    

                                    處理耗時任務  

                                    sendSuccessMessage(arrayList);  

                                 }  

—————————————————————————-  

 

應用初始化時,初始化瞭線程池,和Command 阻塞隊列,那麼由此可知,上面的一系列代碼隻是為瞭實現統一管理 處理耗時任務的 線程,

再簡而言之,Command即類似於 AsynTask 中的 doInBackground()執行的內容。

 

發佈留言