【Android框架进阶〖02〗】ThinkAndroid线程池机制

原创
2014/04/09 13:34
阅读数 1.4K

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

 *  本博客为CSDN博主【MK】原创,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627

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

TAApplicationThinkAndroid的灵魂,整个框架的初始化工作都在这里进行了。

其中有一个重要的工作,即初始化线程池机制 ,英文名为TACommandExecutor

之所以称为机制,是因为这不仅仅是一个线程池。

通过观察代码可以看出,最最重要的代码是

  1. public void ensureInitialized()  
    {  
        if (!initialized)  
        {  
            initialized = true;  
            TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  
            TACommandQueueManager.getInstance().initialize();  
            TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  
        }  
    }


其中涉及到一个很重要的类,即 TACommandQueueManager,看名字就知道这是一个队列管理器 。

好,接下来我们就研究下TACommandQueueManager

非常清晰的,我们看到连个重要的属性,TAThreadPoolTACommandQueue,

看名字就知道一个是线程池,一个是指令队列。然后 TACommandQueueManager的作用就是初始化线程池和初始化队列。

通过研究线程池 TAThreadPool 的代码可以知道,默认仅仅是创建了2个线程,并且在系统启动时运行起来。

通过研究指令队列TACommandQueue的代码可以知道它维护了一个LinkedBlockingQueue,一个阻塞队列,由链表实现。

阻塞队列的好处就是:

  • 当一个线程A申请从队列中取数据时,如果队列中没有数据,那么线程A就发生阻塞,直到队列中存在数据。

  • 同样的,当线程B想向队列中存放数据时,如果队列已满,那么线程B阻塞,直到队列中被取走了一个值,这就是咱们熟悉的生产者消费者模式嘛。

OK,说了这么多,稍微整理下

  1. ------------------------------------  

  2. TACommandQueueManager   初始化了    一个阻塞队列和一个线程池,线程池不断的从队列中取指令并执行  

  3. TACommandExecutor       初始化了    TACommandQueueManager   

  4. TAApplication           初始化了    TACommandExecutor  

  5. ------------------------------------  

基本上搞清楚了,唯一不清楚的就是什么是Command,阻塞队列维护的是什么样的指令呢,线程池执行的到底是什么呢?

我们来分析下

  1. TAICommand:           
        -getRequest()获得请求数据  
        -setRequest(TARequest request)设置请求数据  
        -getResponse()获得返回数据  
        -setResponse(TAResponse response)设置赶回数据  
        -execute()  
        -getResponseListener()获得响应/返回监听器  
        -setResponseListener(TAIResponseListener listener)设置响应/返回监听器  
        -setTerminated(boolean terminated)设置是否终结/停止  
        -isTerminated()判断状态是否停止
  2. ----------------------------------------------------------------------------  
      
            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()执行的内容。


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

 *  本博客为CSDN博主【MK】原创,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627

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


展开阅读全文
打赏
0
10 收藏
分享
加载中
更多评论
打赏
0 评论
10 收藏
0
分享
返回顶部
顶部